-1

可能重复:
php中的嵌套函数在多次调用外部时抛出异常

为什么

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

在不存在的功能栏上返回致命错误

尽管

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

对 bar() 的重复声明给出致命错误?

php 将函数作为全局函数还是在父函数范围内处理?

4

4 回答 4

4

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

您可以function_exists()在创建它之前进行测试:

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

但是,由于嵌套函数的作用域不限于外部函数,因此在另一个函数内部定义函数的用例受到了一些限制。此外,它会在您的代码中引入一些奇怪的副作用,这些副作用可能变得难以理解和维护。考虑您是否真的想这样做,并在必要时重新考虑这样做的原因。如果您正在寻找的是范围限制,那么命名空间类/对象可能会更好地为您服务。

于 2012-08-15T19:54:39.337 回答
2

函数始终在全局范围内创建,但在执行其定义时才创建。

于 2012-08-15T19:53:35.400 回答
0

只有在调用外部函数时才声明“内部”函数。

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

在您的第二个示例中,您调用foo()了两次,因此bar()声明了两次。

于 2012-08-15T19:53:55.763 回答
0

在第一个示例中, bar在函数中声明foo。所以调用bar没有第一次调用是没有意义的,foo因为它的定义还没有被执行。在第二个示例中,您调用foo了两次,因此bar函数被声明了两次。

于 2012-08-15T19:54:26.060 回答