PHP 中的嵌套函数在多次调用外部函数时引发异常


nested functions in php throws an exception when the outer is called more than once

以免假设我有以下内容

function a(){
  function b(){}
}
a(); //pass
a(); //error

为什么在第二次调用中抛出异常并说

cannot re-declare  function b()

我认为每个函数调用都会创建一个新的活动记录,其中包含自己的作用域;就像在其他语言中一样,当我们在一个函数中声明一个变量并调用该函数时,所有变量在其范围内都是活的,为什么内部函数不一样?

命名函数在 PHP 中始终是全局的。因此,您需要检查函数 B 是否已创建:

function A() {
    if (!function_exists('B')) {
        function B() {}
    }
    B();
}

另一种解决方案是使用匿名函数(这更有可能满足您的需求,因为该函数现在存储在变量中,因此是函数范围 A 的本地):

function A() {
    $B = function() {};
    $B();
}

这是因为当你执行函数a时,它会声明函数b。您可以使用function_exists函数解决此问题。

function a(){
  if(!function_exists('b')){
    function b(){}
  }
}

但我的建议是,你应该在外面声明函数。不在里面。

正是这样说的,当你再次调用a()时,它会尝试重新声明b(),在a()之外声明b(),并从内部调用b() a()如下所示:

function a() {
  b();
}
function b() {}
a();
a();

在另一个函数中声明一个函数在 php 中会被认为是不好的做法。如果你真的需要在a()中有一个函数,你应该创建一个闭包。

function a() {
  $b = function() {
  };
}
这是因为

您在全局范围内调用a()。添加一个function_exists调用以使上面的代码正常工作,但实际上很少有场景真正应该做这样的事情。