【问题标题】:PHP workflow - order of execution of functionsPHP 工作流程 - 函数的执行顺序
【发布时间】:2013-02-26 09:59:30
【问题描述】:

我想知道 PHP 引擎解释函数声明的顺序。我不知道为什么 somethimes PHP 显示 Call to undefined function 致命错误,而 somethimes 解释器看到该函数没有问题。

假设我的代码是:

echo theRest(4,3);

function theRest($a, $b)
{
   return $a % $b;
}

看到函数是在调用后声明的,这可以正常工作。这意味着PHP在解释之前读取了整个文件?

另一个例子:

echo theRest(4,3);

include('test2.php');

test2.php

function theRest($a, $b)
{
    return $a % $b;
}

这里出现致命错误:调用未定义函数 theRest()。这是为什么?

【问题讨论】:

  • 删除了我之前的帖子,因为第一个帖子在我的机器上运行。 (我得到了 1)希望有人也能提供答案。
  • 看看这个Question会不会是类似的问题?而且,顺便说一句,如果您只是将include('test2.php'); 行放在该函数之前,PHP 是否会给您任何错误?你知道,只是为了尝试一下:)
  • YourLanguageSucks wiki 页面上提到了这一点

标签: php workflow execution


【解决方案1】:

当 PHP 读取文件时,它会将其编译为字节码(编译时),然后执行(执行时/运行时)。

在编译时读取无条件函数声明,以便在执行代码时知道函数。

另一方面,包含在执行时执行,因此在执行include() 本身之前,包含文件中定义的函数不可用。无法在编译时执行包含,因为参数可能是动态的(例如 include $path_to_file;)并且取决于您的代码可能修改的 include_path 设置。

The documentation 很清楚这一点:

函数在被引用之前不需要定义,除了当一个函数被有条件地定义时,如下面的两个例子所示。

使用include() 时,您的函数实际上是有条件定义的(例如,include "foo.php"; 可以包含一个文件或另一个文件,具体取决于include_path 设置)。

【讨论】:

  • 谢谢大家。我想这意味着我将不再在条件语句的内外移动“无条件”函数来压缩不存在的处理时间。
【解决方案2】:

意味着PHP在解释之前正在读取整个文件?

是的,PHP 一次解析一个文件。并且“include”是一个语句,而不是在编译时发生的事情,因此一旦到达包含行,就会解析包含的文件。另一方面,函数定义不是语句,而是在编译时处理,除了位于控制结构内。这就是以下工作的原因:

if (!function_exists('ucwords')) {
    function ucwords($str) {
        //...
    }
}

因此,文件中已被解析并且位于控制结构之外的每个函数和类定义都可以立即使用。

【讨论】:

    【解决方案3】:

    在这段代码中:

    echo theRest(4,3);
    
    function theRest($a, $b)
    {
       return $a % $b;
    }
    

    首先编译整个代码,然后运行您的代码。但是,在这段代码中:

    echo theRest(4,3);
    
    include('test2.php');
    

    include 语句本身已编译,但在代码到达执行点之前不会执行。

    include 放在它被引用的点之前可以修复它:

    include('test2.php');
    
    echo theRest(4,3);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      • 2017-03-15
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 2015-10-03
      相关资源
      最近更新 更多