J'ai remarqué que je peux utiliser l'un des Closure
ou Callable
comme indice de type si nous nous attendions à ce qu'une fonction de rappel s'exécute. Par exemple:
function callFunc1(Closure $closure) {
$closure();
}
function callFunc2(Callable $callback) {
$callback();
}
$function = function() {
echo 'Hello, World!';
};
callFunc1($function); // Hello, World!
callFunc2($function); // Hello, World!
Question:
Quelle est la différence ici? En d'autres termes, quand utiliser Closure
et quand utiliserCallable
OU servent-ils le même objectif?
["Foo", "bar"]
pourFoo::bar
ou[$foo, "bar"]
pour$foo->bar
.callFunc1(Closure::fromCallable("xy"))
. wiki.php.net/rfc/closurefromcallableClosure
+Closure::fromCallable
, car la chaîne ou le tableaucallable
a toujours été bizarre.Closure
(fonction anonyme) par opposition àcallable
, serait d'empêcher l'accès au-delà de la portée de la fonction appelée. Par exemple, lorsque vous avez un,private method
vous ne voulez pas que quelqu'un abuse d'uncallable
. Voir: 3v4l.org/7TSf2La principale différence entre eux est qu'un
closure
est une classe etcallable
un type .Le
callable
type accepte tout ce qui peut être appelé :Lorsqu'un
closure
sera seulement accepter une fonction anonyme. Notez que dans la version PHP 7.1 , vous pouvez convertir des fonctions à une fermeture comme ceci:Closure::fromCallable('functionName')
.Exemple:
Alors pourquoi utiliser un
closure
overcallable
?Sévérité parce qu'un
closure
est un objet qui a des méthodes supplémentaires:call()
,bind()
etbindto()
. Ils vous permettent d'utiliser une fonction déclarée en dehors d'une classe et de l'exécuter comme si elle était à l'intérieur d'une classe.Vous n'aimeriez pas appeler des méthodes sur une fonction normale car cela provoquera des erreurs fatales. Donc, pour éviter cela, vous devriez écrire quelque chose comme:
Faire ce contrôle à chaque fois est inutile. Donc, si vous souhaitez utiliser ces méthodes, indiquez que l'argument est un
closure
. Sinon, utilisez simplement un fichier normalcallback
. Par ici; Une erreur est générée lors de l'appel de fonction au lieu de votre code, ce qui facilite grandement le diagnostic.Sur une note latérale: la
closure
classe ne peut pas être étendue comme sa finale .la source
callable
dans aucun espace de noms.Il est à noter que cela ne fonctionnera pas pour les versions PHP 5.3.21 à 5.3.29.
Dans n'importe laquelle de ces versions, vous obtiendrez une sortie comme:
On peut l'essayer en utilisant https://3v4l.org/kqeYD#v5321
Meilleures salutations,
la source
callable
été introduit dans PHP 5.4. Avant que PHP attend une instance d'une classe nomméecallable
, comme si vous aviez spécifié un indice pourPDO
,DateTime
ou\My\Random\ClassName
.