我想知道PHP引擎解释函数声明的顺序。我不知道为什么某些PHP显示调用未定义的函数致命错误和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()。这是为什么?
答案 0 :(得分:8)
意味着PHP在解释之前正在读取整个文件吗?
是的,PHP一次解析一个文件。并且“include”是一个语句,而不是在编译时发生的事情,因此一旦到达包含行就会解析包含的文件。另一方面,函数定义不是语句,并且在编译时处理,除了,当它们位于控件结构中时。这就是以下工作的原因:
if (!function_exists('ucwords')) {
function ucwords($str) {
//...
}
}
因此,已经解析和的文件中的每个函数和类定义都位于控制结构之外,可立即使用。
答案 1 :(得分:7)
当PHP读取文件时,它将其编译为字节码(编译时),然后执行它(执行时间/运行时)。
在编译时读取无条件函数声明,以便在执行代码时已知函数。
另一方面,包含在执行时执行,因此在执行include()
之前,包含文件中定义的函数不可用。包含无法在编译时执行,因为参数可能是动态的(例如include $path_to_file;
),并且取决于您的代码可能修改的include_path
设置。
The documentation非常清楚:
在引用函数之前不需要定义函数,除了,当有条件地定义函数时,如下面的两个例子所示。
使用include()
时,您的功能是有条件定义的(例如,include "foo.php";
可以包含一个文件或另一个文件,具体取决于include_path
设置)。
答案 2 :(得分:0)
在此代码中:
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);