14

我想知道 PHP 引擎解释函数声明的顺序。我不知道为什么 somethimes PHP 显示 Call to undefined function 致命错误,而 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()。这是为什么?

4

3 回答 3

9

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

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

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

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

于 2013-03-11T09:42:00.073 回答
8

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

无条件函数声明是在编译时读取的,因此在执行代码时函数是已知的。

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

该文档对此非常清楚:

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

使用 时include(),您的函数实际上是有条件定义的(例如,include "foo.php";可以根据include_path设置包含一个文件或另一个文件)。

于 2013-03-11T09:41:04.550 回答
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);
于 2013-03-11T09:54:37.057 回答