可能重复:
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 :(得分:4)
函数本身在全局范围内定义,即使它是在另一个函数中定义的。在第一种情况下,如果您未在foo()
之前致电bar()
,则bar()
将不存在。
您可以在创建之前使用function_exists()
进行测试:
function foo(){
// Don't redefine bar() if it is already defined
if (!function_exists("bar")) {
function bar(){
}
}
}
但是,由于嵌套函数不作用于外部函数,因此在另一个函数内定义函数的用例有些限制。此外,它在您的代码中引入了一些奇怪的副作用,这些副作用可能变得难以理解和维护。考虑一下你是否真的想要这样做,并在必要时重新考虑你这样做的理由。如果您要查找的是范围限制,namespaces或classes/objects可能会为您提供更好的服务。
答案 1 :(得分:2)
在全局范围内创建始终的函数,但在执行其定义时仅。
答案 2 :(得分:0)
函数“inside”仅在调用外部函数时声明。
在您的第一个示例中,您不会调用foo()
,因此永远不会声明bar()
。
在第二个示例中,您拨打foo()
两次,因此bar()
被宣布两次。
答案 3 :(得分:0)
在第一个示例中,bar
在函数foo
中声明。因此,在没有首先调用bar
的情况下调用foo
是没有意义的,因为它的定义尚未执行。在第二个示例中,您要调用foo
两次,以便bar
函数被声明两次。