🧱 Суть

В PHP код приложения обычно разделяется на множество файлов:

  • классы
  • функции
  • конфигурация
  • вспомогательные модули

Чтобы использовать код из другого файла, его нужно подключить.
Для этого существуют:

  • include
  • require
  • include_once
  • require_once
  • autoload

Пример:

require 'config.php';
 
echo DB_HOST;

📦 Проблема

1. Большие файлы сложно поддерживать

Весь код в одном файле быстро становится неудобным:

index.php
 ├─ логика пользователей
 ├─ работа с БД
 ├─ обработка запросов
 └─ HTML

2. Повторное подключение файлов

Если один и тот же файл подключить несколько раз:

require 'database.php';
require 'database.php';

могут возникнуть ошибки:

  • повторное объявление функций
  • повторное объявление классов

3. Ручное подключение всех классов

В большом проекте неудобно писать:

require 'User.php';
require 'Product.php';
require 'Order.php';

Для этого используется автозагрузка.

✅ Решение

Разделять код на отдельные файлы и использовать подходящий способ подключения:

  • require – обязательные файлы
  • include – необязательные файлы
  • *_once – защита от повторного подключения
  • autoload – автоматическая загрузка классов

💻 Код

include

include подключает файл.

include 'header.php';

Если файл не найден – PHP выдаст предупреждение (Warning), но продолжит выполнение.

Пример:

include 'missing.php';
 
echo "Продолжение работы";

Результат:

Warning: failed to open stream
 
Продолжение работы

Используется для необязательных частей:

  • шаблоны
  • дополнительные блоки интерфейса

require

require также подключает файл:

require 'config.php';

Но если файл отсутствует – выполнение остановится.

Пример:

require 'database.php';
 
echo "Код дальше";

Если файла нет:

Fatal error

Используется для обязательных файлов:

  • конфигурация
  • подключение БД
  • важные классы

include_once и require_once

Добавляют защиту от повторного подключения.

Пример:

require_once 'User.php';

Если файл уже был подключён – PHP не загрузит его повторно.

Сравнение

КомандаЕсли файла нетПовторное подключение
includeWarning, код продолжает работатьДа
requireFatal error, остановкаДа
include_onceWarningНет
require_onceFatal errorНет

Подключение файлов в проекте

Пример структуры:

project/

├── index.php
├── config/
│   └── database.php

└── src/
    └── User.php

Подключение:

require_once 'config/database.php';
require_once 'src/User.php';

DIR для безопасных путей

Относительные пути могут ломаться при запуске из разных директорий.

Плохо:

require 'config/database.php';

Лучше:

require __DIR__ . '/config/database.php';

__DIR__ возвращает путь текущего файла.

Автозагрузка классов (autoload)

Проблема

В больших проектах классы могут находиться в сотнях файлов:

require_once 'User.php';
require_once 'Product.php';
require_once 'Order.php';

Это неудобно поддерживать.

Решение

PHP может автоматически подключать файл, когда класс используется.

spl_autoload_register()

Создание собственного автозагрузчика:

spl_autoload_register(function ($class) {
    require $class . '.php';
});

Теперь:

$user = new User();

автоматически попробует загрузить:

User.php

Автозагрузка через Composer

В современных PHP-проектах обычно используют Composer.

Структура:

src/
 ├── User.php
 └── Product.php
 
composer.json

composer.json:

{
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}

После:

composer dump-autoload

Можно использовать:

use App\User;
 
$user = new User();

Composer сам найдёт нужный файл.

PSR-4 автозагрузка

Стандарт PSR-4 связывает:

  • namespace
  • класс
  • путь к файлу

Пример:

namespace App\Models;
 
class User {}

Файл:

src/Models/User.php

Composer автоматически понимает соответствие.

🎯 Вывод

  • include подключает необязательные файлы
  • require используется для обязательных зависимостей
  • *_once предотвращает повторную загрузку
  • __DIR__ помогает создавать стабильные пути
  • ручное подключение файлов плохо масштабируется
  • в современных PHP-проектах используют Composer Autoload
  • PSR-4 является стандартом автозагрузки классов

🔗 Связано