我想知道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);