Рабочий процесс PHP - порядок выполнения функций
Мне интересно узнать о порядке интерпретации объявлений функций с помощью PHP-движка. Я не знаю, почему когда-то PHP показывает Call to undefined функцию фатальной ошибки, а какой-то интерпретатор видит функцию без проблем.
Предположим, что мой код:
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;
}
Здесь я получаю фатальную ошибку: вызов функции undefined theRest(). Почему это?
Ответы
Ответ 1
означает, что PHP читает весь файл перед интерпретацией?
да, PHP анализирует один файл за раз. И "include" - это утверждение, а не то, что происходит во время компиляции, поэтому включенный файл анализируется, как только будет достигнута строка include. Определение функции, с другой стороны, не является оператором и обрабатывается во время компиляции кроме, когда они находятся в структуре управления. Вот почему следующие работы:
if (!function_exists('ucwords')) {
function ucwords($str) {
//...
}
}
Таким образом, каждая функция и определение класса в файле, который был проанализирован и, находится вне структуры управления, доступен сразу.
Ответ 2
Когда PHP читает файл, он компилирует его в байт-код (время компиляции), затем выполняет его (время выполнения/время выполнения).
Безусловные объявления функций читаются во время компиляции, так что функции уже известны, когда ваш код выполняется.
Включает, с другой стороны, исполнение во время выполнения, поэтому функции, определенные во включенном файле, недоступны до выполнения самого include()
. Включить нельзя во время компиляции, поскольку аргумент может быть динамическим (например, include $path_to_file;
) и зависит от параметра include_path
, который может быть изменен вашим кодом.
В документации достаточно ясно сказано:
Функции не обязательно должны быть определены до их ссылки, кроме, когда функция условно определена, как показано в двух примерах ниже.
При использовании include()
ваша функция де-факто условно определена (например, include "foo.php";
может включать один файл или другой в зависимости от параметра include_path
).
Ответ 3
В этом коде:
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);