Zauważyłem, że mogę użyć podpowiedzi typu Closure
lub Callable
jako podpowiedzi typu, jeśli spodziewaliśmy się uruchomienia funkcji wywołania zwrotnego. Na przykład:
function callFunc1(Closure $closure) {
$closure();
}
function callFunc2(Callable $callback) {
$callback();
}
$function = function() {
echo 'Hello, World!';
};
callFunc1($function); // Hello, World!
callFunc2($function); // Hello, World!
Pytanie:
Jaka jest różnica? Innymi słowy, kiedy używać Closure
i kiedy używać Callable
LUB służą temu samemu celowi?
["Foo", "bar"]
ForFoo::bar
lub[$foo, "bar"]
for$foo->bar
.callFunc1(Closure::fromCallable("xy"))
. wiki.php.net/rfc/closurefromcallableClosure
+Closure::fromCallable
, ponieważ łańcuch lub tablica, jakcallable
zawsze, były dziwne.Closure
(funkcja anonimowa) w przeciwieństwie docallable
, byłoby uniemożliwienie dostępu poza zakres wywoływanej funkcji. Na przykład, jeśli masz domenę, doprivate method
której nie chcesz mieć dostępu ktoś nadużywający domenycallable
. Zobacz: 3v4l.org/7TSf2Główną różnicą między nimi jest to, że
closure
jest to klasa i typu .callable
callable
Typ akceptuje wszystko, co można o nazwie :Gdzie
closure
będzie tylko zaakceptować anonimową funkcję. Zauważ, że w PHP wersji 7.1 można zamienić funkcje do zamknięcia tak:Closure::fromCallable('functionName')
.Przykład:
Więc po co używać
closure
overacallable
?Surowość, ponieważ
closure
jest obiektem, który posiada kilka dodatkowych metod:call()
,bind()
ibindto()
. Pozwalają na użycie funkcji zadeklarowanej poza klasą i wykonanie jej tak, jakby była wewnątrz klasy.Nie chciałbyś wywoływać metod w normalnej funkcji, ponieważ spowoduje to krytyczne błędy. Aby więc obejść to musiałbyś napisać coś takiego:
Wykonywanie tego sprawdzania za każdym razem jest bezcelowe. Więc jeśli chcesz użyć tych metod, powiedz, że argumentem jest
closure
. W przeciwnym razie użyj zwykłegocallback
. Tą drogą; Podczas wywołania funkcji zamiast kodu wywoływany jest błąd, co znacznie ułatwia diagnozowanie.Na marginesie:
closure
klasa nie może zostać przedłużony za jego ostateczny .źródło
callable
w żadnej przestrzeni nazw.Warto wspomnieć, że to nie zadziała dla wersji PHP od 5.3.21 do 5.3.29.
W każdej z tych wersji otrzymasz takie dane wyjściowe:
Można to wypróbować, korzystając z https://3v4l.org/kqeYD#v5321
Z poważaniem,
źródło
callable
zostało wprowadzone w PHP 5.4. Przed tym PHP spodziewa instancję klasy o nazwiecallable
, tak jak gdybyś podano podpowiedź dlaPDO
,DateTime
lub\My\Random\ClassName
.