Как работает include?

Я немного в заблуждении, по пониманию того, как работает функция include в PHP.

Функция include (require) импортирует и выполняет код PHP и в то же время корректно отображает разметку на HTML и получается так, что их можно комбинировать. НО если в исполняющий файл PHP самому добавить разметку HTML, то будет, конечно же, ошибка.

Например, если добавить в основной файл PHP код HTML, то PHP перестаёт корректно работать.

<?php
// some code ...
<p>Hello</p>
?>

НО если включить разметку HTML, используя функцию include, то ошибки нет. Например:

<?php
$title_tag = 'Main Page';
include_once 'pages/home.html';
?>

Можете объяснить работу и логику include?


Ответы (1 шт):

Автор решения: Daniil Loban

В принципе, Алексей Шиманский дал ответ, но я хочу немного уточнить возможно мой ответ покажется понятнее.

Например есть файлы как у Вас:

<?php
  $title_tag = 'Main Page';
  include_once 'pages/home.html'; // тут обычный html
?>

Ошибка возникает при непосредственном вводе разметки потому, что PHP встречает символ < который является для него знаком сравнения, а не открытием тега (как Вы могли подумать) и разумеется интерпретатор не может это понять так как это бинарный оператор a < b, а левого операнда нет.

введите сюда описание изображения

ниже фрагмент исключительно для сравнения поведения анализатора кода:

код

Когда же PHP видит include_once 'pages/home.html'; он воспринимает это как обычную инструкцию кода, написанную без ошибок и соответственно ни на что не жалуется.

Исследуя исходники я не нашел конкретного места интерпретации include_once чтобы понять как происходит момент вставки. Однако нашел несколько интересных мест типа:

    case ZEND_AST_INCLUDE_OR_EVAL:
        switch (ast->attr) {
            case ZEND_INCLUDE_ONCE: FUNC_OP("include_once");
            case ZEND_INCLUDE:      FUNC_OP("include");
            case ZEND_REQUIRE_ONCE: FUNC_OP("require_once");
            case ZEND_REQUIRE:      FUNC_OP("require");
            case ZEND_EVAL:         FUNC_OP("eval");
            EMPTY_SWITCH_DEFAULT_CASE();
        }
        break;

Что говорит о схожей природе обработки eval и include_once. Далее я запустил такой скрипт:

<?php
  echo 'При', include_once 'pages/home.html' , 'вет';
?>

В результате увидел ожидаемый вывод:

При<html>...</html>1вет

Почти то же самое:

<?php
   print('Привет' . include_once 'pages/home.html');
?>

Вывод:

<html>...</html>Привет1

Вывод: Содержание включаемого файла парсится как и любой php скрипт не зависимо от расширения файла, даже для .txt и .mp3 файлов, я проверял. Если там встретятся теги <?php и ?> то заключенный в них код отработает.

→ Ссылка