Kodokon kodokon.com

Организация кода: include, структура, константы

Раздели сайт на переиспользуемые файлы с помощью include и require, наведи порядок в структуре проекта и собери константы в одном месте.

7 мин · 3 вопросов

Открыть этот урок в Kodokon

Как только сайт вырастает больше чем на две страницы, дублировать шапку, подвал и функции в каждом файле становится невыносимо. PHP даёт четыре инструкции подключения: include, require и их варианты include_once / require_once. Все они вставляют содержимое файла в точку вызова; разница - в обработке ошибок и в повторных подключениях. Варианты _once запоминают уже загруженные файлы и подключают их только один раз - это обязательно для файлов с функциями, которые нельзя объявить дважды.

PHP
<?php

declare(strict_types=1);

function e(string $value): string
{
    return htmlspecialchars($value, ENT_QUOTES);
}

function formatPrice(float $amount): string
{
    return number_format($amount, 2, '.', ',') . ' €';
}
src/functions.php: вспомогательные функции для всего сайта.

Понятная структура проекта стоит тысячи комментариев. Распространённое соглашение: в public/ лежат страницы, которые отдаются браузеру (это единственная открытая наружу папка), в src/ собраны конфигурация и функции, в templates/ - фрагменты страниц (header.php, footer.php). Встроенный сервер разработки PHP запускают, указав ему на public/.

BASH
mkdir -p my-site/public my-site/src
mkdir -p my-site/templates
cd my-site
php -S localhost:8000 -t public
Создаём структуру, затем запускаем сервер разработки.

Неизменные значения проекта (название сайта, пути, настройки) заслуживают констант, а не переменных: их нельзя случайно перезаписать. const разрешается на этапе компиляции, define() - во время выполнения; на практике в файлах конфигурации лучше const. Для путей всегда добавляй в начало __DIR__ - папку текущего файла: тогда подключения сработают, откуда бы ни запускался скрипт.

PHP
<?php

declare(strict_types=1);

const SITE_NAME = 'La Bonne Pizza';
const ITEMS_PER_PAGE = 12;
const UPLOAD_DIR = __DIR__ . '/../public/uploads';

define('BASE_URL', 'http://localhost:8000');
src/config.php: вся конфигурация в одном месте.

После этого каждая страница превращается в короткую сборку: подключаешь конфигурацию и функции через require, а затем оборачиваешь свой контент шаблонами.

HTML
<?php
require __DIR__ . '/../src/config.php';
require_once __DIR__ . '/../src/functions.php';

$pageTitle = SITE_NAME . ' - Home';
include __DIR__ . '/../templates/header.php';
?>
<main>
  <h1><?= e($pageTitle) ?></h1>
  <p>Pizza of the day: <?= formatPrice(9.5) ?></p>
</main>
<?php include __DIR__ . '/../templates/footer.php'; ?>
public/index.php: страница теперь - просто сборка.

Проверка знаний

Убедись, что запомнил ключевые моменты этого урока.

  1. В чём разница между include и require?
    • include работает быстрее, чем require
    • require работает только с абсолютными путями
    • require останавливает скрипт с фатальной ошибкой, если файла нет, а include выдаёт предупреждение и продолжает
    • Никакой, это два псевдонима
  2. Для чего нужен require_once?
    • Чтобы гарантировать, что файл подключится только один раз, даже если его запрашивают несколько файлов
    • Чтобы подключить файл только на продакшене
    • Чтобы подключить файл, не выполняя его PHP-код
  3. Зачем добавлять __DIR__ в начало путей подключения?
    • Это обязательно начиная с PHP 8
    • Путь становится относительным текущего файла и больше не зависит от папки, из которой запущен скрипт
    • Это включает кеш подключённых файлов