嵌套PHP函数:用于什么目的?

ber*_*kes 6 php nested

为什么PHP允许嵌套函数?

<?php
function foo() {
    function bar() {
        return "bar";
    }
    return "foo";
}
print foo();
print bar();
Run Code Online (Sandbox Code Playgroud)

..是有效的PHP.

但:

  1. 为什么需要嵌套?
  2. 即使如此,为什么我可以从任何地方调用bar(而不是,例如,仅使用foo(),或通过foo.bar()等).

我今天碰到了这个,因为我在某个地方忘记了一个结束括号,而且还有一个太多了.代码有效,没有错误抛出; 但这一切都开始表现得非常奇怪.函数未被声明,回调变得狂暴等等.这是一个功能,如果是这样,目的是什么?还是有些特质?

:评注者指出,这是一个重复哪些PHP嵌套函数.

Pau*_*ier 7

请注意,订单在这里很重要; 你不能在你的例子中调用foo()之前调用bar().这里的逻辑似乎是foo()的执行定义了bar()并将其置于全局范围内,但是由于范围的限制,它没有在执行foo()之前定义.

这里的用法是函数重载的原始形式; 你可以让你的bar()函数执行不同的操作,具体取决于foo()的哪个版本声明它,当然假设每个不同版本的foo()确实定义了一个bar()函数.

  • 我想知道第二次调用`foo()`时会发生什么.人们会认为会抛出错误,因为已经定义了`bar()`. (2认同)
  • @dnagirl:它确实:致命错误:func.已定义. (2认同)

Nik*_*kiC 6

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

简单示例:String\Length根据应用程序中是否打开或关闭多字节支持来定义功能.

namespace String;

if (\MULTIBYTE_MODE) {
    function Length($string) {
        return strlen($string);
    }
} else {
    function Length($string) {
        return mb_strlen($string);
    }
}
Run Code Online (Sandbox Code Playgroud)

嵌套函数只是条件函数定义的特例.