Maison  >  Article  >  développement back-end  >  Quelle est l'utilité de l'utilisation dans la fonction anonyme php

Quelle est l'utilité de l'utilisation dans la fonction anonyme php

怪我咯
怪我咯original
2017-06-28 11:43:282121parcourir

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();
?>

Exécuter la sortie

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)

À propos du timing des variables héritées

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 .


À propos de l'utilisation de la référencepassage par valeur

Nous savons que si vous utilisez une référence pour transmettre une valeur lors de l'utilisation d'une fonction anonyme, alors Les modifications apportées aux valeurs des paramètres dans les fonctions anonymes affecteront également les variables externes correspondantes. Par exemple, l'exemple suivant :

<?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

classe d'objet, même si elle est Il n'est pas montré que la fonction anonyme est passée par référence. Les changements dans les valeurs des variables internes affecteront également les variables externes associées.

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";
};

运行输出1
On 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.


À propos de cela et de l'utilisation dans les fonctions anonymes en classe

<?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();?>
运行结果01
On 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 variable
en

public function mkFunc(){
    $self = $this;    $func = function()use($self){
        echo $this->_num++, "\n";
    };    return $func;
}

运行结果01
pour 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn