函数内声明函数的范围

Cod*_*eat 15 php scope class function

我想知道为什么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" );
    } 
  }
}

}
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释为什么会这样吗?谢谢您的回答.

格尔茨.

Nik*_*kiC 11

在PHP中,无论您何时或何时定义它们,所有函数都始终是全局的.(匿名函数部分是一个例外.)因此,您的函数定义都将是全局函数.

从文档:

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

  • 为了补充这个答案,链接文档还说:"函数在引用之前不需要定义,除非有条件地定义函数...它的定义必须在被调用之前处理." 因此,必须首先调用定义所在的函数才能定义它. (4认同)

ayu*_*ush 6

当您在另一个函数中定义一个函数时,该函数在执行父函数之前并不存在。执行父函数后,就会定义嵌套函数,并且与任何函数一样,可以从当前文档中的任何位置访问。如果代码中有嵌套函数,则只能执行外部函数一次。重复调用将尝试重新声明内部函数,这将产生错误。

现在所有 php 函数默认都是全局的。因此,当您调用外部函数时,您的嵌套函数将成为全局函数

  • “默认”是什么意思?我怎样才能创建一个非全局函数(除了匿名函数,这是一个非常不同的交易。) (2认同)