Percebi que posso usar um Closure
ou outro Callable
tipo de dica se esperávamos que alguma função de retorno de chamada fosse executada. Por exemplo:
function callFunc1(Closure $closure) {
$closure();
}
function callFunc2(Callable $callback) {
$callback();
}
$function = function() {
echo 'Hello, World!';
};
callFunc1($function); // Hello, World!
callFunc2($function); // Hello, World!
Questão:
Qual a diferença aqui? Em outras palavras, quando usar Closure
e quando usar Callable
OU eles servem ao mesmo propósito?
["Foo", "bar"]
paraFoo::bar
ou[$foo, "bar"]
para$foo->bar
.callFunc1(Closure::fromCallable("xy"))
. wiki.php.net/rfc/closurefromcallableClosure
+Closure::fromCallable
, porque string ou arraycallable
sempre foi estranho.Closure
(função anônima), ao contráriocallable
, seria impedir o acesso além do escopo da função chamada. Por exemplo, quando você tem umprivate method
, não deseja acessar por alguém que esteja abusando de umcallable
. Veja: 3v4l.org/7TSf2A principal diferença entre eles é que a
closure
é uma classe ecallable
um tipo .O
callable
tipo aceita qualquer coisa que possa ser chamada :Quando um
closure
vai única aceitar uma função anônima. Note que no PHP versão 7.1 você pode converter funções para um fecho assim:Closure::fromCallable('functionName')
.Exemplo:
Então, por que usar um
closure
overcallable
?Rigor porque um
closure
é um objecto que tem alguns métodos adicionais:call()
,bind()
ebindto()
. Eles permitem que você use uma função declarada fora de uma classe e execute-a como se estivesse dentro de uma classe.Você não gostaria de chamar métodos com uma função normal, pois isso gerará erros fatais. Portanto, para contornar você teria que escrever algo como:
Para fazer isso, verifique sempre que não faz sentido. Portanto, se você deseja usar esses métodos, declare que o argumento é a
closure
. Caso contrário, basta usar um normalcallback
. Deste jeito; Um erro é gerado na chamada de função em vez do seu código, tornando-o muito mais fácil de diagnosticar.Em uma nota lateral: A
closure
turma não pode ser estendida como final .fonte
callable
em nenhum espaço para nome.Vale ressaltar que isso não funcionará nas versões 5.3.21 a 5.3.29 do PHP.
Em qualquer uma dessas versões, você obterá uma saída como:
Pode-se tentar isso usando https://3v4l.org/kqeYD#v5321
Cumprimentos,
fonte
callable
foi introduzido no PHP 5.4. Antes que o PHP está esperando uma instância de uma classe chamadacallable
, como se você tivesse especificado uma dica paraPDO
,DateTime
ou\My\Random\ClassName
.