可能重复:
php中的嵌套函数在多次调用外部时抛出异常
为什么
function foo(){
function bar(){
}
}
bar();
在不存在的功能栏上返回致命错误
尽管
function foo(){
function bar(){
}
}
foo();
foo();
对 bar() 的重复声明给出致命错误?
php 将函数作为全局函数还是在父函数范围内处理?
可能重复:
php中的嵌套函数在多次调用外部时抛出异常
为什么
function foo(){
function bar(){
}
}
bar();
在不存在的功能栏上返回致命错误
尽管
function foo(){
function bar(){
}
}
foo();
foo();
对 bar() 的重复声明给出致命错误?
php 将函数作为全局函数还是在父函数范围内处理?
函数本身是在全局范围内定义的,即使它是在另一个函数内部定义的。foo()
在第一种情况下,如果您之前不调用bar()
,bar()
则将不存在。
您可以function_exists()
在创建它之前进行测试:
function foo(){
// Don't redefine bar() if it is already defined
if (!function_exists("bar")) {
function bar(){
}
}
}
但是,由于嵌套函数的作用域不限于外部函数,因此在另一个函数内部定义函数的用例受到了一些限制。此外,它会在您的代码中引入一些奇怪的副作用,这些副作用可能变得难以理解和维护。考虑您是否真的想这样做,并在必要时重新考虑这样做的原因。如果您正在寻找的是范围限制,那么命名空间或类/对象可能会更好地为您服务。
函数始终在全局范围内创建,但仅在执行其定义时才创建。
只有在调用外部函数时才声明“内部”函数。
在您的第一个示例中,您不调用foo()
,因此bar()
从未声明过。
在您的第二个示例中,您调用foo()
了两次,因此bar()
声明了两次。
在第一个示例中, bar
在函数中声明foo
。所以调用bar
没有第一次调用是没有意义的,foo
因为它的定义还没有被执行。在第二个示例中,您调用foo
了两次,因此bar
函数被声明了两次。