Что это и зачем нужно
В PHP код можно хранить не в одном большом файле, а разбивать на части: отдельно — настройки, отдельно — подключение к базе данных, отдельно — шапка сайта, подвал, логика вывода статей и т. д. Директивы include, require и их версии с _once как раз и нужны, чтобы «собрать» итоговую страницу из этих кусочков.
Когда PHP доходит до такой директивы, он берёт содержимое указанного файла и подставляет его прямо в это место. После этого весь код (переменные, функции, классы) из подключённого файла становится доступен в текущем скрипте. Это упрощает поддержку: если нужно поменять шапку, её правят в одном файле — и она обновляется на всех страницах.
В чём разница
| Директива | Если файла нет | Повторное подключение |
|---|---|---|
include |
Выдает Warning, скрипт работает дальше | Подключает снова |
require |
Выдает Fatal Error, скрипт останавливается | Подключает снова |
include_once |
Выдает Warning, скрипт работает дальше | Не подключает повторно |
require_once |
Выдает Fatal Error, скрипт останавливается | Не подключает повторно |
Где что применять
Используй require_once, когда файл критически важен.
Без него скрипт не должен работать. Это:
- конфиги (
config.php); - подключение к БД (
db_connect.php); - файлы с функциями и классами.
Пример:
require_once __DIR__ . '/config.php'; require_once __DIR__ . '/db_connect.php';
Используй include_once, когда блок необязателен.
Если файла нет — страница должна отрисоваться без этого куска. Это:
- шапка и подвал (
header.php,footer.php); - виджеты, баннеры, блоки статистики.
Пример:
include_once __DIR__ . '/header.php'; include_once __DIR__ . '/footer.php';
Почему почти всегда берут версию с _once
Если подключить файл без _once дважды, а в нём объявлена функция или класс, PHP выдаст ошибку: Cannot redeclare function / Cannot declare class.
_once проверяет, был ли файл уже подключён, и при повторном вызове пропускает его. Это страховка от ошибок при сложной структуре проекта.
Пример использования
index.php будет выглядеть примерно так:
<?php require_once __DIR__ . '/config.php'; // обязательно require_once __DIR__ . '/db_connect.php'; // обязательно ?> <!DOCTYPE html> <html lang="ru"> <head> <meta charset="utf-8"> <title>Блог</title> <link rel="stylesheet" href="site.css"> </head> <body> <?php include_once __DIR__ . '/header.php'; ?> <main class="container"> <?php if (isset($_GET['slug'])) { require_once 'read_post.php'; // отдельная статья } else { require_once 'read_post_loop.php'; // список статей } ?> </main> <?php include_once __DIR__ . '/footer.php'; ?> </body> </html>
Здесь:
config.phpиdb_connect.php— обязательны, поэтомуrequire_once: если их нет, сайт не должен пытаться работать дальше.header.phpиfooter.php— визуальные блоки: если вдруг пропадут, пусть страница отрисуется без них, поэтомуinclude_once.- Логика вывода статьи или списка — обязательна для отображения контента, поэтому тоже
require_once.
