4

以免假设我有以下

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

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

cannot re-declare  function b()

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

4

5 回答 5

7

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

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

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

function A() {
    $B = function() {};
    $B();
}
于 2012-08-15T10:54:21.260 回答
4

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

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

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

于 2012-08-15T10:53:07.553 回答
1

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

function a() {
  b();
}

function b() {}

a();
a();
于 2012-08-15T10:53:30.027 回答
1

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

function a() {
  $b = function() {

  };
}
于 2012-08-15T11:13:37.217 回答
0

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

于 2012-08-15T10:53:57.127 回答