Ich habe festgestellt, dass ich entweder einen Closure
oder einen Callable
Typhinweis verwenden kann, wenn wir erwartet haben, dass eine Rückruffunktion ausgeführt wird. Beispielsweise:
function callFunc1(Closure $closure) {
$closure();
}
function callFunc2(Callable $callback) {
$callback();
}
$function = function() {
echo 'Hello, World!';
};
callFunc1($function); // Hello, World!
callFunc2($function); // Hello, World!
Frage:
Was ist der Unterschied hier? Mit anderen Worten, wann Closure
und wann zu verwenden Callable
ODER sie dienen dem gleichen Zweck?
["Foo", "bar"]
fürFoo::bar
oder[$foo, "bar"]
für$foo->bar
.callFunc1(Closure::fromCallable("xy"))
. wiki.php.net/rfc/closurefromcallableClosure
+Closure::fromCallable
-Ansatz ehrlich , weil String oder Array wiecallable
immer komisch waren.Closure
(anonyme Funktion) zu verlangencallable
, wäre, den Zugriff über den Umfang der aufgerufenen Funktion hinaus zu verhindern. Wenn Sie beispielsweise eineprivate method
haben, möchten Sie nicht, dass jemand auf eine Person zugreift, die eine missbrauchtcallable
. Siehe: 3v4l.org/7TSf2Der Hauptunterschied zwischen ihnen besteht darin, dass a
closure
eine Klasse undcallable
ein Typ ist .Der
callable
Typ akzeptiert alles, was aufgerufen werden kann :Wo eine
closure
wird nur eine anonyme Funktion übernehmen. Beachten Sie, dass Sie in PHP Version 7.1 Funktionen wie folgt in einen Abschluss konvertieren können :Closure::fromCallable('functionName')
.Beispiel:
Warum also ein
closure
Over verwendencallable
?Strikt weil eine
closure
ist ein Objekt , das einige zusätzliche Methoden hat:call()
,bind()
undbindto()
. Mit ihnen können Sie eine außerhalb einer Klasse deklarierte Funktion verwenden und so ausführen, als ob sie sich innerhalb einer Klasse befindet.Sie möchten keine Methoden für eine normale Funktion aufrufen, da dies schwerwiegende Fehler verursacht. Um dies zu umgehen, müsste man so etwas schreiben wie:
Dies jedes Mal zu überprüfen ist sinnlos. Wenn Sie diese Methoden verwenden möchten, geben Sie an, dass das Argument a ist
closure
. Ansonsten einfach einen normalen verwendencallback
. Diesen Weg; Beim Funktionsaufruf wird anstelle Ihres Codes ein Fehler ausgegeben, der die Diagnose erheblich erleichtert.Nebenbei bemerkt: Die
closure
Klasse kann nicht als endgültig erweitert werden .quelle
callable
in keinem Namespace qualifizieren müssen.Es ist erwähnenswert, dass dies für die PHP-Versionen 5.3.21 bis 5.3.29 nicht funktioniert.
In jeder dieser Versionen erhalten Sie eine Ausgabe wie:
Man kann das mit https://3v4l.org/kqeYD#v5321 ausprobieren
Freundliche Grüße,
quelle
callable
, dass in PHP 5.4 eingeführt wurde. Zuvor erwartet PHP eine Instanz einer Klasse mit dem Namencallable
, so als ob Sie einen Hinweis für angegeben habenPDO
,DateTime
oder\My\Random\ClassName
.