2010-11-15 69 views
6

为什么PHP允许嵌套函数?嵌套PHP函数:为了什么目的?

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

..是有效的PHP。

但是:

  1. 为什么会没有需要嵌套?即使如此,为什么我可以从任何地方调用bar(而不是,例如只用foo()或trough foo.bar()等)。

我今天遇到了这个,因为我忘了一个闭合支架的某个地方,并且还有一个更多的下降。该代码是有效的,没有错误抛出;但这一切开始表现得很奇怪。函数没有被声明,回调会疯狂等等。 这是一个功能,如果是这样,为了什么目的?还是一些特质?

答案:评注者指出,这是一个复制的What are php nested functions for

+1

可爱。好像PHP需要另一个原因来获得仇恨... – 2010-11-15 17:29:10

+1

已经很好地覆盖了:[可能是[为什么是PHP嵌套功能?]的重复(http://stackoverflow.com/questions/415969/what-are- php-nested-functions-for) – meagar 2010-11-15 17:30:09

+3

另外,仅仅因为你不明白的东西并不会使它成为“idiocracy”,这不是一个字。 – meagar 2010-11-15 17:32:31

回答

7

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

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

+2

我想知道当'foo()'被调用时会发生什么第二次。有人会认为会抛出一个错误,因为bar()已经被定义了。 – dnagirl 2010-11-15 17:37:45

+2

@dnagirl:它确实:致命错误:func。已经定义。 – berkes 2010-11-15 17:40:37

6

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

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

namespace String; 

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

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