PHP函数执行顺序


PHP order of execution of functions

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

假设我的代码是:

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((。为什么?

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

是的,PHP一次解析一个文件。"include"是一个语句,而不是编译时发生的事情,因此只要到达include行,就会解析包含的文件。另一方面,函数定义不是语句,在编译时处理,除非位于控制结构中。这就是为什么以下工作:

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

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

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

无条件函数声明在编译时读取,这样在执行代码时函数就已经知道了。

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

文件对此非常清楚:

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

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

在此代码中:

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);