Noté que puedo usar cualquiera Closureo Callablecomo 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 Closurey cuándo usar CallableO sirven para el mismo propósito?

["Foo", "bar"]paraFoo::baro[$foo, "bar"]para$foo->bar.callFunc1(Closure::fromCallable("xy")). wiki.php.net/rfc/closurefromcallableClosure+Closure::fromCallable, porque la cadena o matriz comocallablesiempre 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 methodno desea que alguien que acceda a él acceda a élcallable. Ver: 3v4l.org/7TSf2La principal diferencia entre ellos es que a
closurees una clase ycallableun tipo .El
callabletipo acepta cualquier cosa que se pueda llamar :Cuando una
closurese 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
closureovercallable?Rigor porque un
closurees 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
closureclase no se puede extender como su final .fuente
callableen 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
callablese 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,DateTimeo\My\Random\ClassName.