PHP函数嵌套:有何用途?

6
为什么PHP允许嵌套函数?
<?php
function foo() {
    function bar() {
        return "bar";
    }
    return "foo";
}
print foo();
print bar();

..是有效的PHP代码。

但:

  1. 为什么需要嵌套?
  2. 即使需要,为什么我可以从任何地方调用bar(而不是只能在foo()内部或通过foo.bar()等方式)。

今天我遇到了这个问题,因为我忘记了某个地方的闭括号,并在稍后多加了一个。代码是有效的,没有报错;但它开始表现得非常奇怪。函数未被声明,回调出现故障等等。

答案:评论者指出这是PHP嵌套函数的重复问题


1
可爱。PHP好像不需要再招致仇恨的理由了... - Ignacio Vazquez-Abrams
1
已经被很好地讨论过了:可能是什么是PHP嵌套函数?的重复。 - user229044
3
你不理解某个事物,并不意味着它是“智障文化”(idiocracy,这其实不是一个单词)。请注意,只需要翻译,不得添加解释或其他内容。 - user229044
@meagar:我认为他的意思是“特质”。 - Ignacio Vazquez-Abrams
@Ignacio,我认为他的意思是“愚蠢”... - user229044
显示剩余6条评论
2个回答

7
请注意顺序很重要;在您的示例中,在调用foo()之前不能调用bar()。这里的逻辑似乎是执行foo()定义了bar()并将其放置在全局范围内,但由于作用域的原因,在执行foo()之前它未被定义。
使用这里是一种基本形式的函数重载;您可以让bar()函数根据声明它的每个不同版本的foo()执行不同的操作,前提是每个不同版本的foo()确实定义了一个bar()函数。

2
我想知道当第二次调用 foo() 时会发生什么。人们可能会认为会抛出错误,因为 bar() 已经被定义了。 - dnagirl

6
在PHP中,您可以有条件地定义函数、运行时常量甚至类。这使您可以根据情况定义不同的函数/常量/类。
简单的例子:根据应用程序中是否启用多字节支持来定义String\Length函数。
namespace String;

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接