Le manuel PHP indique
Il n'est pas possible d'utiliser
$this
une fonction anonyme avant PHP 5.4.0
sur la page des fonctions anonymes . Mais j'ai trouvé que je peux le faire fonctionner en attribuant $this
à une variable et en passant la variable à une use
instruction à la définition de la fonction.
$CI = $this;
$callback = function () use ($CI) {
$CI->public_method();
};
Est-ce une bonne pratique?
Existe-t-il un meilleur moyen d'accéder à l' $this
intérieur d'une fonction anonyme en utilisant PHP 5.3?
php
anonymous-function
à vapeur
la source
la source
$CI = $this;
et$CI =& $this;
ne sont pas réellement identiques. Peut-être pour vos besoins, mais ce n'est pas la même chose. Essayez$CI = 'bla'; var_dump($this);
avec les deux versions pour voir la différence.Réponses:
Il échouera lorsque vous essayez d'appeler une méthode protégée ou privée dessus, car l'utiliser de cette façon compte comme un appel de l'extérieur. Il n'y a aucun moyen de contourner ce problème dans 5.3 pour autant que je sache, mais avec PHP 5.4, cela fonctionnera comme prévu, hors de la boîte:
class Hello { private $message = "Hello world\n"; public function createClosure() { return function() { echo $this->message; }; } } $hello = new Hello(); $helloPrinter = $hello->createClosure(); $helloPrinter(); // outputs "Hello world"
De plus, vous pourrez changer ce à quoi $ this pointe au moment de l'exécution, pour les fonctions anonymus (reliure de fermeture):
class Hello { private $message = "Hello world\n"; public function createClosure() { return function() { echo $this->message; }; } } class Bye { private $message = "Bye world\n"; } $hello = new Hello(); $helloPrinter = $hello->createClosure(); $bye = new Bye(); $byePrinter = $helloPrinter->bindTo($bye, $bye); $byePrinter(); // outputs "Bye world"
En effet, les fonctions anonymus auront une méthode bindTo () , où le premier paramètre peut être utilisé pour spécifier vers quoi $ this pointe, et le second paramètre contrôle quel devrait être le niveau de visibilité . Si vous omettez le deuxième paramètre, la visibilité sera comme un appel de «l'extérieur», par exemple. seules les propriétés publiques sont accessibles. Notez également le fonctionnement de bindTo, il ne modifie pas la fonction d'origine, il en renvoie une nouvelle .
la source
$this
.Ne comptez pas toujours sur PHP pour passer des objets par référence, lorsque vous attribuez une référence elle-même, le comportement n'est pas le même que dans la plupart des langages OO où le pointeur d'origine est modifié.
votre exemple:
$CI = $this; $callback = function () use ($CI) { $CI->public_method(); };
devrait être:
$CI = $this; $callback = function () use (&$CI) { $CI->public_method(); };
NOTEZ LA RÉFÉRENCE "&" et $ CI doivent être attribuées après les appels finaux, encore une fois, vous pourriez avoir une sortie imprévisible, en PHP accéder à une référence n'est pas toujours la même chose que d'accéder à la classe d'origine - si cela a du sens.
http://php.net/manual/en/language.references.pass.php
la source
C'est la manière normale de procéder.
btw, essayez de supprimer le
&
cela devrait fonctionner sans cela, car les objets passent par ref de toute façon.la source
Cela semble correct si votre passage par référence est la bonne façon de le faire. Si vous utilisez PHP 5, vous n'avez pas besoin du
&
symbole auparavant$this
car il passera toujours par référence de toute façon.la source
C'est bon. Je devrais penser que vous pourriez faire ceci aussi:
$CI = $this;
... puisque les affectations impliquant des objets copieront toujours des références, pas des objets entiers.
la source