PHP工作流程 - 执行函数的顺序

web*_*.pl 14 php workflow execution

我想知道PHP引擎解释函数声明的顺序.我不知道为什么某些PHP显示调用未定义的函数致命错误和somethimes解释器看到函数没有问题.

我们假设我的代码是:

echo theRest(4,3);

function theRest($a, $b)
{
   return $a % $b;
}
Run Code Online (Sandbox Code Playgroud)

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

另一个例子:

echo theRest(4,3);

include('test2.php');
Run Code Online (Sandbox Code Playgroud)

test2.php

function theRest($a, $b)
{
    return $a % $b;
}
Run Code Online (Sandbox Code Playgroud)

这里我得到致命错误:调用未定义函数theRest().这是为什么?

Fer*_*yer 8

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

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

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

文档非常清楚:

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

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


Fab*_*ler 8

是指PHP在解释之前读取整个文件?

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

if (!function_exists('ucwords')) {
    function ucwords($str) {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,已经解析驻留在控制结构之外的文件中的每个函数和类定义都可立即使用.