Je passe une variable dans une fonction anonyme (fermeture) via use
, et dans le corps de fermeture, je modifie la valeur de la variable:
$myVar = false; $myAnonFunc = function() use ($myVar) { $myVar = true; }; $myAnonFunc(); echo '$myVar => ' . ($myVar ? 'TRUE' : 'FALSE') . PHP_EOL; // Expected `$myVar => TRUE` but got `$myVar => FALSE`
I je m'attends à ce que $ myVar
dans la fermeture soit lié à $ myVar
dans la portée parente, de sorte que les modifications apportées à la variable $ myVar
dans la fermeture sont reflétées dans le parent. Cela ne semble pas se produire. En quoi la compréhension des fermetures PHP est-elle incorrecte et quelles devraient être mes attentes? Comment puis-je réellement faire ce que je veux?
3 Réponses :
Le $ myVar
dans la portée de fermeture est une copie . La changer ne changera pas la variable dans la portée parent.
Ce que vous pouvez faire si vous voulez passer une référence de la variable à la place.
$myAnonFunc = function() use (&$myVar) { $myVar = true; };
Cela se comportera comme vous attendez.
Parce que les changements dans la portée du bloc restent dans la portée du bloc. Si vous souhaitez modifier ses données d'adresse, vous pouvez passer par référence.
$myVar => TRUE
$myVar = false; $myAnonFunc = function() use (&$myVar) { // changes will be reflected at its address $myVar = true; }; $myAnonFunc(); echo '$myVar => ' . ($myVar ? 'TRUE' : 'FALSE') . PHP_EOL; // Expected `$myVar => TRUE` but got `$myVar => FALSE`
Vous devez transmettre une référence à $ myVar
$myAnonFunc = function() use (&$myVar) { $myVar = true; };