【问题标题】:How to access variable from scope of parent function?如何从父函数范围访问变量?
【发布时间】:2012-01-13 15:42:05
【问题描述】:

我希望我的函数能够访问一个外部变量——特别是从它的父函数。但是,使用global 关键字设置的范围太广了;我需要限制它。如何让这段代码吐出“2 级”而不是“1 级”?我必须上课吗?

<?php
$a = "Level 1";

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

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

    second();
}

first();
//outputs 'Level 1'
?>

【问题讨论】:

    标签: php function scope global


    【解决方案1】:

    PHP 没有嵌套函数或范围的概念,嵌套函数是一种糟糕的做法。发生的情况是 PHP 只是遇到一个函数声明并创建一个普通函数second。如果您再次尝试调用first,PHP 将再次遇到second 的函数声明并崩溃,因为函数second 已经声明。因此,不要在函数中声明函数。

    至于传递值,要么将它们作为函数参数显式传递,要么如您所说,创建一个类如果这有意义

    【讨论】:

    • 啊哈!感谢您的教育回答。这很有道理,你解释得很好。我试试函数参数路由。
    • 也可以防御性检查if ( function_exists('second') ) {}
    【解决方案2】:

    只是为了举例,如果我理解你想要做什么,你可以使用closure(PHP 5.3+),因为“闭包也可以从父作用域继承变量 em>" 带有 use 关键字。

    $a = "Level 1";
    
    function first() {
        $a = "Level 2";
    
        $func = function () use ($a) {
            echo $a.'<br />';
        };
    
        $func();
    }
    
    first();
    // prints 'Level 2<br />'
    

    闭包最常用于回调函数。但是,这可能不是使用其中一个的最佳方案。正如其他人所建议的那样,仅仅因为您可以做某事并不意味着这是最好的主意。

    【讨论】:

    • 哇,你们真快。我将搁置该建议以供将来参考。谢谢!
    • 我还需要将数据传入和传出回调函数,因此我必须编写use (&amp;$a) 以通过引用传递它。 (记住 preg_replace_callback 场景中的匹配项。)
    猜你喜欢
    • 2022-08-16
    • 2013-02-09
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多