Как работает 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 шт):
В принципе, Алексей Шиманский дал ответ, но я хочу немного уточнить возможно мой ответ покажется понятнее.
Например есть файлы как у Вас:
<?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 и ?> то заключенный в них код отработает.

