嵌套函数的怪事
问题描述:
可能重复:不存在的功能栏上
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函数作为全局函数或父函数作用域来处理?
答
函数本身在全局范围内定义,即使它是在另一个函数内定义的。在第一种情况下,如果您在bar()
之前没有拨打foo()
,则bar()
将不存在。
你可以用function_exists()
测试创建前:
function foo(){
// Don't redefine bar() if it is already defined
if (!function_exists("bar")) {
function bar(){
}
}
}
然而,由于嵌套函数是不作用域外功能,使用情况定义另一个函数内部功能比较有限。此外,它会在您的代码中引入一些可能难以理解和维护的奇怪副作用。考虑你是否真的想这样做,并在必要时重新考虑你这样做的理由。如果您正在寻找的是范围限制,您可能更适合namespaces或classes/objects。
答
函数“inside”仅在调用外部函数时声明。
在第一个示例中,您不调用foo()
,因此bar()
从不声明。
在第二个示例中,您拨打foo()
两次,因此bar()
被声明了两次。
答
在第一个示例中,在函数foo
中声明bar
。因此,如果没有首先调用foo
,调用bar
是没有意义的,因为它的定义尚未执行。在第二个示例中,您要拨打foo
两次,以使bar
函数被声明两次。
如你所说...全球! – 2012-08-15 19:53:49
请参阅PHP手册,它非常好地解释了这种情况。手册页在这里:http://php.net/manual/functions.user-defined.php,见例3 *函数内的函数*。 - 这些函数在他们的例子中甚至有相同的名字! – hakre 2012-08-15 19:59:25
[RTFM](http://php.net/manual/en/functions.user-defined.php#example-147) – salathe 2012-08-15 20:05:03