Noté que puedo usar cualquiera Closure
o Callable
como sugerencia de tipo si esperábamos que se ejecutara alguna función de devolución de llamada. Por ejemplo:
function callFunc1(Closure $closure) {
$closure();
}
function callFunc2(Callable $callback) {
$callback();
}
$function = function() {
echo 'Hello, World!';
};
callFunc1($function); // Hello, World!
callFunc2($function); // Hello, World!
Pregunta:
¿Cuál es la diferencia aquí? En otras palabras, ¿cuándo usar Closure
y cuándo usar Callable
O sirven para el mismo propósito?
["Foo", "bar"]
paraFoo::bar
o[$foo, "bar"]
para$foo->bar
.callFunc1(Closure::fromCallable("xy"))
. wiki.php.net/rfc/closurefromcallableClosure
+Closure::fromCallable
, porque la cadena o matriz comocallable
siempre ha sido extraña.Closure
(función anónima) en lugar decallable
, sería evitar el acceso más allá del alcance de la función llamada. Por ejemplo, cuando tiene unprivate method
no desea que alguien que acceda a él acceda a élcallable
. Ver: 3v4l.org/7TSf2La principal diferencia entre ellos es que a
closure
es una clase ycallable
un tipo .El
callable
tipo acepta cualquier cosa que se pueda llamar :Cuando una
closure
se sólo se aceptará una función anónima. Tenga en cuenta que en PHP versión 7.1 puede convertir funciones a un cierre de este modo:Closure::fromCallable('functionName')
.Ejemplo:
Entonces, ¿por qué usar un
closure
overcallable
?Rigor porque un
closure
es un objeto que tiene algunos métodos adicionales:call()
,bind()
ybindto()
. Le permiten usar una función declarada fuera de una clase y ejecutarla como si estuviera dentro de una clase.No le gustaría llamar a los métodos en una función normal, ya que generará errores fatales. Entonces, para evitar eso, tendrías que escribir algo como:
Hacer esto comprobar cada vez no tiene sentido. Entonces, si desea utilizar esos métodos, indique que el argumento es a
closure
. De lo contrario, solo use un normalcallback
. De esta manera; Se genera un error en la llamada de función en lugar de su código, lo que hace que sea mucho más fácil de diagnosticar.En una nota al margen: La
closure
clase no se puede extender como su final .fuente
callable
en ningún espacio de nombres.Vale la pena mencionar que esto no funcionará para las versiones de PHP 5.3.21 a 5.3.29.
En cualquiera de esas versiones obtendrá un resultado como:
Uno puede probar eso usando https://3v4l.org/kqeYD#v5321
Atentamente,
fuente
callable
se introdujo en PHP 5.4. Antes de que PHP está esperando una instancia de una clase llamadacallable
, como si usted había especificado una sugerencia paraPDO
,DateTime
o\My\Random\ClassName
.