Maison  >  Article  >  développement back-end  >  Les fonctions imbriquées PHP peuvent-elles être appelées en dehors de leur portée ?

Les fonctions imbriquées PHP peuvent-elles être appelées en dehors de leur portée ?

DDD
DDDoriginal
2024-10-29 01:05:29493parcourir

Can PHP Nested Functions Be Called Outside Their Enclosing Scope?

Fonctions PHP imbriquées : objectif et utilisation

Dans le domaine de PHP, les fonctions imbriquées introduisent un élément d'encapsulation et d'organisation du code. Même si elles ne sont peut-être pas aussi omniprésentes que leurs homologues JavaScript, les fonctions imbriquées PHP trouvent leur place dans certains scénarios.

Considérez cet exemple :

<code class="php">function outer($msg)
{
    function inner($msg)
    {
        echo 'inner: ' . $msg . ' ';
    }

    echo 'outer: ' . $msg . ' ';
    inner($msg);
}

inner('test1'); // Fatal error: Call to undefined function inner()
outer('test2'); // outer: test2 inner: test2
inner('test3'); // inner: test3
outer('test4'); // Fatal error: Cannot redeclare inner()</code>

Comme vous pouvez le constater, lorsque vous essayez de invoquez la fonction inner() directement en dehors de la fonction external(), cela entraîne une erreur fatale car elle est limitée à la portée de la fonction external(). Ce comportement s'aligne sur le concept de portée lexicale, où une fonction imbriquée hérite de la portée de sa fonction englobante et n'est pas accessible depuis l'extérieur de cette portée.

Si vous travaillez avec PHP 5.3 ou version ultérieure, vous pouvez tirer parti fonctions anonymes pour obtenir un comportement plus proche de celui de JavaScript :

<code class="php">function outer()
{
    $inner = function() {
        echo "test\n";
    };

    $inner();
}

outer();
outer();

inner(); // PHP Fatal error: Call to undefined function inner()
$inner(); // PHP Fatal error: Function name must be a string</code>

Sortie :

test
test

Dans cet exemple, la fonction anonyme $inner est définie dans la fonction external() et a accès à son périmètre. Cependant, il reste limité à cette portée et ne peut pas être invoqué directement depuis la portée globale.

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