PHP 上的嵌套函数怪异


Nested function weirdness on PHP

可能的重复项:
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函数被声明两次。