Подключение файлов в PHP: include, require, include_once, require_once

Что это и зачем нужно

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

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


В чём разница

Директива Если файла нет Повторное подключение
include Выдает Warning, скрипт работает дальше Подключает снова
require Выдает Fatal Error, скрипт останавливается Подключает снова
include_once Выдает Warning, скрипт работает дальше Не подключает повторно
require_once Выдает Fatal Error, скрипт останавливается Не подключает повторно

Где что применять

Используй require_once, когда файл критически важен.
Без него скрипт не должен работать. Это:

  • конфиги (config.php);
  • подключение к БД (db_connect.php);
  • файлы с функциями и классами.

Пример:

php
require_once __DIR__ . '/config.php';
require_once __DIR__ . '/db_connect.php';

Используй include_once, когда блок необязателен.
Если файла нет — страница должна отрисоваться без этого куска. Это:

  • шапка и подвал (header.php, footer.php);
  • виджеты, баннеры, блоки статистики.

Пример:

php
include_once __DIR__ . '/header.php';
include_once __DIR__ . '/footer.php';

Почему почти всегда берут версию с _once

Если подключить файл без _once дважды, а в нём объявлена функция или класс, PHP выдаст ошибку: Cannot redeclare function / Cannot declare class.
_once проверяет, был ли файл уже подключён, и при повторном вызове пропускает его. Это страховка от ошибок при сложной структуре проекта.


Пример использования

index.php будет выглядеть примерно так:

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.

Добавить комментарий