代码之家  ›  专栏  ›  技术社区  ›  berkes

嵌套PHP函数:目的是什么?

  •  6
  • berkes  · 技术社区  · 14 年前

    为什么PHP允许嵌套函数?

    <?php
    function foo() {
        function bar() {
            return "bar";
        }
        return "foo";
    }
    print foo();
    print bar();
    

    …是有效的PHP。

    但是:

    1. 为什么需要筑巢?
    2. 即使如此,为什么我可以从任何地方调用BAR(而不是,例如,只使用foo(),或者槽foo.bar()等等)。

    我今天遇到这个问题,因为我忘了在某个地方加一个右括号,还有一个太多了。代码是有效的,没有抛出任何错误;但所有这些都开始表现得很奇怪。函数没有声明,回调变得疯狂等等。 这是一个特性吗?如果是的话,是为了什么目的?还是有点特别?

    回答 :Commentor指出这是一个 复制品 属于 What are php nested functions for .

    2 回复  |  直到 12 年前
        1
  •  7
  •   Paul Sonier    14 年前

    注意,这里的顺序很重要;在您的示例中,在调用foo()之前不能调用bar()。这里的逻辑似乎是foo()的执行定义了bar()并将其放在全局范围内,但由于作用域的原因,在foo()执行之前没有定义它。

    这里的用法是函数重载的一种基本形式;您可以让bar()函数根据声明它的foo()版本执行不同的操作,当然,假定每个不同版本的foo()确实定义了bar()函数。

        2
  •  6
  •   NikiC    12 年前

    在PHP中,可以有条件地定义函数、运行时常量甚至类。这允许您根据情况定义不同的函数/常量/类。

    简单示例:定义 String\Length 函数取决于应用程序中多字节支持是打开还是关闭。

    namespace String;
    
    if (\MULTIBYTE_MODE) {
        function Length($string) {
            return strlen($string);
        }
    } else {
        function Length($string) {
            return mb_strlen($string);
        }
    }
    

    嵌套函数只是条件函数定义的一种特殊情况。