require, include, require_once, include_once в PHP: полный разбор с примерами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

require, include, require_once, include_once в PHP: что выбрать и почему это важно?

Вы когда-нибудь ловили себя на мысли: «А какая, собственно, разница между require и include в PHP? И зачем придумали эти странные _once версии?» — Если да, то вы не одиноки. Этот вопрос входит в топ самых популярных на Stack Overflow (тысячи просмотров и десятки голосов). И это не случайно.

Каждый день тысячи PHP-разработчиков — от новичков до опытных — используют эти функции. Но многие используют их на автомате, не задумываясь о последствиях. А зря. Неправильный выбор может привести к фатальным ошибкам, дублированию кода или, что ещё хуже, к неочевидным багам, которые проявятся только на боевом сервере.

Сегодня мы раз и навсегда разберёмся, чем отличаются require, include, require_once и include_once. Вы узнаете не только теорию, но и увидите живые примеры кода, которые можно сразу запустить. Погнали!

1. База: зачем вообще подключать файлы?

Прежде чем говорить о различиях, давайте вспомним, зачем мы это делаем. В реальных проектах PHP-код не пишут в одном гигантском файле. Это было бы кошмаром для поддержки. Вместо этого код разбивают на модули:

  • Конфигурация — config.php
  • Функции — functions.php
  • Шаблоны — header.php, footer.php
  • Классы — User.php, Database.php

И вот тут-то нам и нужны require и include. Они буквально «вклеивают» содержимое одного файла в другой. PHP обрабатывает подключённый файл так, как будто его код был написан прямо в этом месте.

2. require vs include: главное отличие — реакция на ошибку

Это самый важный момент. Запомните его раз и навсегда.

include — мягкое подключение

include пытается подключить файл. Если файла не существует или произошла ошибка, PHP выдаёт Warning (предупреждение), но продолжает выполнение скрипта.

<?php
// include.php
echo "Это include. ";
include 'несуществующий_файл.php'; // Вызовет Warning
echo "Скрипт продолжает работу!";
?>

Результат:

Это include. Warning: include(несуществующий_файл.php): failed to open stream...
Скрипт продолжает работу!

Видите? Скрипт не упал, а пошёл дальше. Это удобно, когда подключение файла — опционально. Например, если вы подключаете виджет, который не критичен для работы страницы.

require — жёсткое подключение

require делает то же самое, но с одним отличием: если файл не найден, PHP выдаёт Fatal Error (фатальную ошибку) и немедленно останавливает скрипт.

<?php
// require.php
echo "Это require. ";
require 'несуществующий_файл.php'; // Вызовет Fatal Error
echo "Этот код никогда не выполнится!";
?>

Результат:

Это require. Fatal error: Uncaught Error: Failed opening required 'несуществующий_файл.php'...

Скрипт умер. Всё. Дальше — тишина.

Когда что использовать?

  • require — для критически важных файлов: конфигурация БД, основные классы, роутер. Если их нет, сайт работать не может.
  • include — для опциональных блоков: шаблоны, виджеты, рекламные баннеры. Если файл не подключится, страница просто отобразится без этого блока.

3. require_once и include_once: защита от дублирования

А теперь представьте ситуацию. У вас есть файл config.php, который объявляет константы и функции. Вы подключаете его в header.php и в footer.php. А потом на странице подключаете оба этих файла. Что произойдёт?

Правильно: фатальная ошибка! Потому что вы попытаетесь повторно объявить уже существующую константу или функцию.

<?php
// config.php
define('SITE_NAME', 'PythonLib');
echo "Config загружен. ";
?>

<?php
// index.php (плохой пример)
require 'config.php'; // Config загружен.
require 'config.php'; // Fatal error: Cannot redefine constant SITE_NAME
?>

Чтобы избежать этого, и были придуманы require_once и include_once. Они проверяют: «А не подключали ли мы уже этот файл?» Если да — пропускают.

<?php
// index.php (хороший пример)
require_once 'config.php'; // Config загружен.
require_once 'config.php'; // Ничего не произойдёт, файл уже подключён
echo "Всё отлично!";
?>

Важное уточнение: PHP определяет «уже подключался ли файл» по его абсолютному пути. Если вы подключите один и тот же файл через разные относительные пути, PHP может посчитать их разными файлами и загрузить снова. Поэтому всегда используйте __DIR__ или абсолютные пути в продакшене.

4. Сравнительная таблица: все 4 функции

Функция Поведение при ошибке Проверка дублирования Когда использовать
include Warning + продолжение Нет Опциональные блоки, шаблоны, виджеты
require Fatal Error + остановка Нет Критически важные файлы (конфиги, классы)
include_once Warning + продолжение Да Опциональные файлы, которые могут быть подключены повторно
require_once Fatal Error + остановка Да Стандартный выбор для 90% случаев

Блоги

Рекомендаций по книгам