Подтвердить что ты не робот

Рабочий процесс 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(). Почему это?

4b9b3361

Ответ 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);