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

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

怪我咯
Libérer: 2023-03-11 17:50:01
original
2139 Les gens l'ont consulté

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();
?>
Copier après la connexion

Exécuter la sortie

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
Copier après la connexion

À 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();
?>
Copier après la connexion

Exécuter la sortie

PHP Notice:  Undefined variable: msg in /search/ballqiu/c.php on line 4
Copier après la connexion

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);
?>
Copier après la connexion
Exécuter la sortie

Array
(
    [0] => 2
    [1] => 2
    [2] => 3
)
Array
(
    [0] => 2
    [1] => 2
    [2] => 3
)
Copier après la connexion
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);
?>
Copier après la connexion
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
        )

)
Copier après la connexion
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();
?>
Copier après la connexion
Nous utilisons plutôt le passage de référence

$func = function()use(&$msg){
    echo $msg[0],"\n";
};

运行输出1
Copier après la connexion
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
Copier après la connexion
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
Copier après la connexion
en

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

运行结果01
Copier après la connexion
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!

Étiquettes associées:
php
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal