如何从父函数的范围访问变量?

JP *_*Lew 5 php scope global function

我希望我的函数能够专门从其父函数访问外部变量.但是,使用global关键字设置范围太广; 我需要限制它.如何让这段代码吐出'Level 2'而不是'Level 1'?我必须上课吗?

<?php
$a = "Level 1";

function first() {
    $a = "Level 2";

    function second() {
        global $a;
        echo $a.'<br />';
    }

    second();
}

first();
//outputs 'Level 1'
?>
Run Code Online (Sandbox Code Playgroud)

Wis*_*guy 28

仅仅是为了举例,如果我理解你要做什么,你可以使用一个闭包(PHP 5.3+),因为" 闭包也可以使用use关键字从父作用域继承变量 " .

$a = "Level 1";

function first() {
    $a = "Level 2";

    $func = function () use ($a) {
        echo $a.'<br />';
    };

    $func();
}

first();
// prints 'Level 2<br />'
Run Code Online (Sandbox Code Playgroud)

闭包最常用于回调函数.但是,这可能不是使用它的最佳方案.正如其他人所说的那样,仅仅因为你可以做某事并不意味着它是最好的主意.


dec*_*eze 12

PHP没有嵌套函数或作用域的概念,嵌套函数是一种可怕的做法.会发生什么是PHP只是遇到函数声明并创建一个正常的函数second.如果你first再次尝试调用,PHP将再次遇到函数声明second和崩溃,因为该函数second已经声明.因此,不要在函数内声明函数.

至于传递值,要么显式地将它们作为函数参数传递,要么如果有意义的话,创建一个类.