web-dev-qa-db-fra.com

Utiliser un mot-clé dans les fonctions - PHP

Duplicata possible:
Dans Php 5.3.0, quel est l'identifiant de la fonction "Utiliser"? Un programmeur sensé devrait-il l'utiliser?

J'ai examiné les fermetures dans PHP et c'est ce qui a attiré mon attention:

public function getTotal($tax)
    {
        $total = 0.00;

        $callback =
            function ($quantity, $product) use ($tax, &$total)
            {
                $pricePerItem = constant(__CLASS__ . "::PRICE_" .
                    strtoupper($product));
                $total += ($pricePerItem * $quantity) * ($tax + 1.0);
            };

        array_walk($this->products, $callback);
        return round($total, 2);
    }

Et quelqu'un, s'il vous plaît, donnez-moi une explication sur l'utilisation de use dans ce code.

function ($quantity, $product) use ($tax, &$total)

Lorsque je recherche use en PHP, il trouve use mot-clé où il est utilisé dans les espaces de noms mais ici, il semble différent.

Merci.

71
Tarik

L'utilisation de "use" est également correcte dans ce cas.

Avec les fermetures, pour accéder à des variables qui sont en dehors du contexte de la fonction, vous devez accorder explicitement l'autorisation à la fonction à l'aide de la fonction use. Dans ce cas, cela signifie que vous accordez à la fonction l'accès aux variables $ tax et $ total.

Vous remarquerez que $ tax a été transmis en tant que paramètre de la fonction getTotal tandis que $ total a été défini juste au-dessus de la ligne où la fermeture est définie.

Une autre chose à souligner est que $ tax est passé en tant que copie tandis que $ total est passé par référence (en ajoutant le signe & devant). Le passage par référence permet à la fermeture de modifier la valeur de la variable. Toute modification de la valeur de $ tax dans ce cas ne sera effective que pendant la fermeture alors que la valeur réelle de $ total.

105
Francois Deschenes

Lorsque vous déclarez une fonction anonyme dans PHP vous devez lui dire quelles variables des étendues environnantes (le cas échéant) elle doit fermer - elles ne se ferment pas automatiquement sur les variables lexicales dans le champ qui sont mentionnés dans le corps de la fonction. La liste après use est simplement la liste des variables à fermer.

15
hobbs

Cela signifie que votre fonction interne peut utiliser les variables $ tax et $ total de la fonction externe, pas seulement ses paramètres.

2
Yuri Stuken