0
votes

La modification d'une variable passée à une fonction anonyme PHP ne semble pas être reflétée dans la portée d'origine des variables

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?

REPL du code ci-dessus


0 commentaires

3 Réponses :


3
votes

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.


0 commentaires

3
votes

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

Démo

$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`


0 commentaires

3
votes

Vous devez transmettre une référence à $ myVar

$myAnonFunc = function() use (&$myVar) {
    $myVar = true;
};


0 commentaires