函数内声明函数的范围

Posted

技术标签:

【中文标题】函数内声明函数的范围【英文标题】:Scope of declared function within a function 【发布时间】:2011-06-12 11:38:59 【问题描述】:

我想知道为什么当函数在类函数中声明时,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" );
     
  



谁能向我解释为什么会发生这种情况? 谢谢你的回答。

问候。

【问题讨论】:

为了我的好奇,在方法中声明函数有什么好处? @Gordon 你必须先调用它所在的函数才能定义它。 @MikeB - 也许还有其他原因,但这种方法可能是一种“匿名功能”的尝试。这样做的正确格式在这里:php.net/manual/en/functions.anonymous.php 【参考方案1】:

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

From the documentation:

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

【讨论】:

要添加到这个答案,链接文档还说:“函数在被引用之前不需要定义,除非有条件地定义函数......它的定义必须在被处理之前被处理叫。”因此,必须首先调用定义所在的函数才能对其进行定义。 您现在可能希望更新此内容以包含有关命名空间的信息,因为该答案已指向一个新问题,【参考方案2】:

当你在另一个函数中定义一个函数时,它不存在 直到父函数执行完毕。一旦父函数有 被执行,嵌套函数被定义并且与任何 函数,可从当前文档中的任何位置访问。如果你 在你的代码中有嵌套函数,你只能执行外部 功能一次。重复调用会尝试重新声明内部 函数,这将产生错误。

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

【讨论】:

“默认”是什么意思?如何创建非全局函数(匿名函数除外,这是一个非常不同的交易。)

以上是关于函数内声明函数的范围的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 HelloWorld 函数没有在这个范围内声明?

使用代码:Linux 上的块在 C++ 中的函数中的“未在范围内声明”

Python 类中的变量范围

Python 类中的变量范围

javascript 作用域详解

为啥函数被描述为块范围