嵌套函数的怪事

问题描述:

可能重复:不存在的功能栏上
nested functions in php throws an exception when the outer is called more than once嵌套函数的怪事

为什么

function foo(){ 
    function bar(){ 
    }  
} 
bar(); 

返回致命错误

function foo(){ 
    function bar(){ 
    }  
} 
foo(); 
foo(); 

给bar()的重复声明带来致命错误?

确实将php函数作为全局函数或父函数作用域来处理?

+0

如你所说...全球! – 2012-08-15 19:53:49

+0

请参阅PHP手册,它非常好地解释了这种情况。手册页在这里:http://php.net/manual/functions.user-defined.php,见例3 *函数内的函数*。 - 这些函数在他们的例子中甚至有相同的名字! – hakre 2012-08-15 19:59:25

+0

[RTFM](http://php.net/manual/en/functions.user-defined.php#example-147) – salathe 2012-08-15 20:05:03

函数本身在全局范围内定义,即使它是在另一个函数内定义的。在第一种情况下,如果您在bar()之前没有拨打foo(),则bar()将不存在。

你可以用function_exists()测试创建前:

function foo(){ 
    // Don't redefine bar() if it is already defined 
    if (!function_exists("bar")) { 
     function bar(){ 
     }  
    } 
} 

然而,由于嵌套函数是作用域外功能,使用情况定义另一个函数内部功能比较有限。此外,它会在您的代码中引入一些可能难以理解和维护的奇怪副作用。考虑你是否真的想这样做,并在必要时重新考虑你这样做的理由。如果您正在寻找的是范围限制,您可能更适合namespacesclasses/objects

功能是总是创建在全球范围内,但只有当他们的定义执行。

+1

你能解释一下在PHP中“执行定义”的含义吗? – hakre 2012-08-15 20:07:43

函数“inside”仅在调用外部函数时声明。

在第一个示例中,您不调用foo(),因此bar()从不声明。

在第二个示例中,您拨打foo()两次,因此bar()被声明了两次。

在第一个示例中,在函数foo中声明bar。因此,如果没有首先调用foo,调用bar是没有意义的,因为它的定义尚未执行。在第二个示例中,您要拨打foo两次,以使bar函数被声明两次。