函数内声明的函数的作用域

17

我想知道为什么当一个函数被声明在类的函数内部时,PHP处理已声明函数的作用域与普通函数不同。

例如:

function test() // global function
{
  function myTest() // global function. Why?
  {
    print( "Hello world" );
  } 
}

class CMyTestClass
{
  public function test() // method of CMyTestClass
  {
    function myTest() // This declaration will be global! Why?
    {
      print( "Hello world" );
    } 
  }
}

}

有人能解释一下为什么会发生这种情况吗? 谢谢你的回答。

问候。


出于好奇,声明方法内的函数有什么优势? - Mike B
@Gordon 你必须先调用函数,这样它才会被定义。 - Wiseguy
@MikeB - 或许还有其他原因,但这种方法可能是一种尝试使用“匿名函数”的方式。正确的格式在这里:http://php.net/manual/en/functions.anonymous.php - rinogo
2个回答

12

PHP中,所有函数始终是全局的,无论您何时或如何定义它们。(匿名函数在某种程度上是例外。)因此,您的函数定义将成为全局。

根据文档

PHP中的所有函数和类都具有全局作用域——即使它们是在函数内定义的,也可以在函数外部调用,反之亦然。


4
补充这个答案,链接的文档还说:“函数在被引用之前不需要定义,除非一个函数是有条件定义的...必须在调用之前处理其定义。”因此,包含定义的函数必须首先被调用才能被定义。 - Wiseguy
1
您可能希望更新此内容以包括有关命名空间的信息,因为一个新问题已经指向了这个答案。 - Barkermn01
箭头函数也是全局的吗? - theking2

6
当您在另一个函数内定义函数时,该函数不会存在,直到执行父函数。一旦执行了父函数,嵌套函数就被定义了,就像任何函数一样,在当前文档中随处可访问。如果您的代码中有嵌套函数,则只能执行外部函数一次。重复调用将尝试重新声明内部函数,这将生成错误。
现在所有PHP函数默认都是全局的。因此,只要调用外部函数,您的嵌套函数就会变成全局函数。

2
“by default”是什么意思?我如何创建一个非全局函数(除了匿名函数之外,匿名函数是一个完全不同的概念)? - NikiC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接