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

时间:2013-03-11 09:25:21

标签: php workflow execution

我想知道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()。这是为什么?

3 个答案:

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