Maison > Article > développement back-end > Quelle est l'utilité de l'utilisation dans la fonction anonyme php
La fonction d'utilisation dans la
fonction anonyme est d'hériter des variables de la portée parent.
L'exemple suivant est l'utilisation la plus courante. Si use n'est pas utilisé, la variable $msg ne sera pas trouvée dans la fonction.
<?php $msg = [1,2,3]; $func = function()use($msg){ print_r($msg); }; $func(); ?>
Array ( [0] => 1 [1] => 2 [2] => 3 )
Le comportement des variables héritéesest dans une fonction Est-elle générée lorsqu'elle est définie ou lorsque la fonction est appelée ? Ajustons l'ordre du code dans l'exemple ci-dessus et plaçons $msg après la définition de la fonction.
<?php $func = function()use($msg){ print_r($msg); }; $msg = [1,2,3]; $func(); ?>
Exécuter la sortie
PHP Notice: Undefined variable: msg in /search/ballqiu/c.php on line 4
On peut voir que le comportement des variables héritées est généré lorsque la fonction est définie. Dans l'exemple ci-dessus,
msg est défini, donc lorsque la fonction est exécutée, $msg est la variable non définie .
<?php $msg = [1,2,3]; $func = function()use(&$msg){ $msg[0]++; print_r($msg); }; $func(); print_r($msg); ?>Exécuter la sortie
Array ( [0] => 2 [1] => 2 [2] => 3 ) Array ( [0] => 2 [1] => 2 [2] => 3 )Donc dans tous les cas, si vous souhaitez modifier la valeur d'une variable externe via une fonction anonyme, vous devez passer la valeur à utiliser par référence. Regardez l'exemple suivant :
<?php $msg = new ArrayObject([1,2,3], ArrayObject::ARRAY_AS_PROPS); $func = function()use($msg){ $msg[0]++; print_r($msg); }; $func(); print_r($msg); ?>Exécuter la sortie
ArrayObject Object ( [storage:ArrayObject:private] => Array ( [0] => 2 [1] => 2 [2] => 3 ) ) ArrayObject Object ( [storage:ArrayObject:private] => Array ( [0] => 2 [1] => 2 [2] => 3 ) )Il est visible que si vous passez une variable de type Cependant, le problème est revenu. Lors du passage d'une variable d'objet à utiliser, y a-t-il une différence entre utiliser une référence et ne pas utiliser de référence ? Regardons l'exemple
<?php $func = function()use($msg){ echo $msg[0],"\n"; }; $msg = new ArrayObject([1,2,3], ArrayObject::ARRAY_AS_PROPS); $func(); ?>Nous utilisons plutôt le passage de référence
$func = function()use(&$msg){ echo $msg[0],"\n"; }; 运行输出1On peut voir que lors de l'utilisation du passage de référence, même si la variable est en retard par rapport à la définition de la fonction, le correspondant La variable externe peut toujours être trouvée à l'intérieur de la fonction, il n'y aura aucune situation où la variable n'est pas définie. Il y a encore une différence entre les deux.
<?phpclass C{ protected $_num = 0; public function mkFunc(){ $func = function(){ echo $this->_num++, "\n"; }; return $func; } public function get(){ echo $this->_num,"\n"; } }$obj = new C();$func = $obj->mkFunc();$func();$obj->get();?> 运行结果01On peut voir que ceci dans les fonctions anonymes fait référence à l'objet
actuel , vous pouvez le trouver directement sans utiliser.
Toujours avec l'exemple ci-dessus, quel sera l'effet si vous devez utiliser use ?Changez mkFunc en
public function mkFunc(){ //唯一改动是此处加了use $func = function()use($this){ echo $this->_num++, "\n"; }; return $func; } 运行输出 PHP Fatal error: Cannot use $this as lexical variableen
public function mkFunc(){ $self = $this; $func = function()use($self){ echo $this->_num++, "\n"; }; return $func; } 运行结果01pour voir si use est utilisé, l'effet est le même.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!