可能的重复项:
PHP 中的嵌套函数在多次调用外部函数时引发异常
为什么
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(){
}
}
}
但是,由于嵌套函数的范围不限于外部函数,因此在另一个函数中定义函数的用例受到一定限制。 此外,它会在您的代码中引入一些奇怪的副作用,这些副作用可能变得难以理解和维护。 考虑一下你是否真的想这样做,并在必要时重新考虑你这样做的原因。如果您正在寻找的是范围限制,则命名空间或类/对象可能会更好地为您服务。
函数始终在全局范围内创建,但仅在执行其定义时创建。
函数
"inside"仅在调用外部函数时声明。
在您的第一个示例中,您不调用 foo()
,因此永远不会声明bar()
。
在第二个示例中,您调用foo()
两次,因此bar()
声明两次。
在第一个示例中,bar
在函数 foo
中声明。 因此,如果不先调用bar
,调用foo
就没有意义,因为它的定义尚未执行。 在第二个示例中,您调用foo
两次,因此bar
函数被声明两次。