Сайты и программы на PHP содержат тысячи, десятки тысяч и сотни тысяч строк кода. В таких условиях одним файлом с кодом не обойдешься — его нужно разбивать на части.
Чтобы мы могли получить доступ к коду, который находится в других файлах, в PHP реализован механизм включения. Он состоит из четырех специальных конструкций:
include
include_once
require
require_once
В этом уроке мы познакомимся с этими конструкциями. Начнем с конструкции require
:
<?php
// file: print.php
function sayHi()
{
print_r('Hi!');
}
// file: index.php
require_once 'print.php';
sayHi(); // => Hi!
Включение файла с кодом делает доступным его содержимое в том месте, куда он включается. В примере выше функция sayHi
определяется в файле print.php
и становится видна из файла index.php
.
То же самое относится не только к определению функций, но даже к переменным:
<?php
// file: print.php
$x = 'Hi!';
// file: index.php
require_once 'print.php';
print_r($x); // => Hi!
Последний пример наталкивает на интересную мысль. Раз переменная появилась внутри файла index.php
, то это значит, что конструкция require_once
исполняет весь код, который находится во включаемом файле. В этом легко убедиться, поставив эксперимент:
<?php
// file: print.php
print_r("Hi from print.php!\n");
// file: index.php
require_once 'print.php';
print_r("Hi from index.php!\n");
Попробуем запустить:
php index.php
Hi from print.php!
Hi from index.php!
Видно, что сначала выполнился код во включаемом файле, а только потом — код в файле index.php
. Можно считать, что require_once
берет содержимое включаемого файла и вставляет его вместо себя. То есть код выше работает так, как будто он написан следующим образом:
<?php
// index.php
print_r("Hi from print.php!\n");
print_r("Hi from index.php!\n");
Этот механизм рекурсивен по своей природе: если во включаемом файле есть другой включаемый файл, то сначала исполнится он. Такое поведение чем-то похоже на матрешку. Можно сказать, что весь код всех файлов проекта находится в одном пространстве и доступен для использования напрямую.
Из всех четырех конструкций для включения файлов пользоваться имеет смысл только одной — require_once
. Она обладает двумя важными свойствами:
- Если файл отсутствует, то эта конструкция приведет к ошибке, и программа остановит свое выполнение
- Если в
require_once
передается файл, который уже был где-то загружен ранее, то она не будет выполнять этот файл повторно, но код этого файла все равно будет доступным
Эти два условия важны, потому что код, опирающийся на них, получается более качественным и простым. В отличие от require_once
, остальные конструкции не отвечают этим требованиям:
require
исполняет включаемый файл каждый разinclude
иinclude_once
не приводят к ошибке в ситуации, когда файла не существует
Этот урок нужен лишь для понимания происходящих внутри процессов. В реальном же коде за включение файлов отвечает Composer — менеджер управления зависимостями, который будем проходить в курсе про настройку окружения.
Как вы увидите в следующих курсах, современный стандарт разработки на PHP полагается на механизм автозагрузки и запрещает использование явного включения файлов.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты