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

时间:2011-12-05 22:59:11

标签: php function scope global

我希望我的函数能够专门从其父函数访问外部变量。但是,使用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'
?>

2 个答案:

答案 0 :(得分:27)

仅仅为了举例,如果我理解你要做什么,你可以使用closure(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 />'

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

答案 1 :(得分:9)

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

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