PHP上的嵌套函数怪异

时间:2012-08-15 19:51:45

标签: php function nested-function

  

可能重复:
  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将函数作为全局函数或父函数范围处理吗?

4 个答案:

答案 0 :(得分:4)

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

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

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

但是,由于嵌套函数作用于外部函数,因此在另一个函数内定义函数的用例有些限制。此外,它在您的代码中引入了一些奇怪的副作用,这些副作用可能变得难以理解和维护。考虑一下你是否真的想要这样做,并在必要时重新考虑你这样做的理由。如果您要查找的是范围限制,namespacesclasses/objects可能会为您提供更好的服务。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

函数“inside”仅在调用外部函数时声明。

在您的第一个示例中,您不会调用foo(),因此永远不会声明bar()

在第二个示例中,您拨打foo()两次,因此bar()被宣布两次。

答案 3 :(得分:0)

在第一个示例中,bar在函数foo中声明。因此,在没有首先调用bar的情况下调用foo是没有意义的,因为它的定义尚未执行。在第二个示例中,您要调用foo两次,以便bar函数被声明两次。