Перейти к содержимому
Поиск
Php Разработка

PHP: полный мануал с примерами, функциями и ООП

Практический мануал PHP: от переменных и читаемого кода до безопасных форм, интеграций, базы данных и ООП на примере магазина. Учебный маршрут, поиск функций, подробные примеры, разбор ошибок и исходники для скачивания.

Александр НекрасовИзменено:
Практический мануал PHP: от переменных и функций к объектной модели интернет-магазина
PHP 8.5.11149 глав4458 карточек справочника
Дерево руководства

Глава 56 · Практика

Composer, пространства имён и автозагрузка

Управляем библиотеками воспроизводимо и понимаем, откуда берётся подключённый класс.

Composer: устанавливаем библиотеку и подключаем её классы

Для отправки HTTP-запросов можно взять готовую библиотеку. Composer хранит список зависимостей проекта, согласует версии и создаёт файл подключения. Это отдельная программа для терминала, а не функция PHP.

Что уже пригодится. возврат результата, пространства имён

От зависимости до вызова
  1. Терминал: composer require guzzlehttp/guzzle
  2. composer.json: требования, composer.lock: выбранные версии
  3. vendor/: файлы установленных пакетов
  4. require vendor/autoload.php
  5. Класс используется → автозагрузчик находит файл

require выполняет подключаемый PHP-файл. Подключение autoload.php регистрирует загрузчики; все классы сразу в память не загружаются. Каталог vendor обычно создаёт Composer, исходники ваших классов лежат отдельно, например в src.

Сначала понимаем простое подключение PHP-файлаСамостоятельный пример
<?php
declare(strict_types=1);

$settings = require __DIR__ . '/settings.php';
echo $settings['shop'], "\n";
Ожидаемый результат
Мастерская

__DIR__ — папка текущего PHP-файла. Точка соединяет путь с именем файла. Подключённый settings.php возвращает массив через return; присваивание сохраняет его. Это небольшой опыт с require, не замена автозагрузке Composer.

Следующая ступень. Далее создаём composer.json, устанавливаем пакет, подключаем автозагрузчик и разбираем соответствие namespace и папок PSR-4.

Зависимость — часть вашего приложения

Наглядная модель

Как имя класса приводит к нужному файлу

В коде нужен Demo\Report. Composer помогает найти класс, но не создаёт все объекты при подключении проекта.

  1. composer install

    Устанавливает зависимости по lock-файлу и подготавливает vendor/autoload.php.

  2. require vendor/autoload.php

    Подключает загрузчик классов. Указанные в autoload.files файлы подключаются отдельно по этому правилу.

  3. new Demo\Report()

    PHP требуется класс Report. Если он ещё не загружен, вызывается зарегистрированный загрузчик.

  4. PSR-4 находит src/Report.php

    При правиле Demo\ → src/ имя класса указывает на файл с соответствующим namespace.

  5. Создаётся экземпляр

    После объявления класса PHP создаёт объект и вызывает его конструктор, если он определён.

use задаёт короткое имя класса, а не подключает файл. Регистр namespace, каталогов и имени PHP-файла должен совпадать.

Для отправки HTTP-запросов, проверки HTML или тестирования не обязательно писать всё с нуля. Composer устанавливает PHP-пакеты, проверяет ограничения версий и создаёт автозагрузчик. Но библиотека остаётся кодом, который выполняется с правами приложения. Изучайте поддержку, лицензию, совместимость PHP и расширений, а также то, действительно ли задача требует этой зависимости.

composer.json описывает допустимые версии и настройки проекта. composer.lock фиксирует конкретное разрешённое дерево зависимостей приложения. Коммит lock-файла позволяет коллегам и сборке установить те же версии. Команда install использует lock, update пересчитывает зависимости в рамках ограничений и меняет lock. Поэтому запускать update на production во время релиза — плохой способ воспроизводимой доставки.

vendor обычно не редактируют вручную: следующий install уничтожит исправление. Если в библиотеке ошибка, обновляют версию, предлагают исправление автору или применяют управляемый патч с понятным сроком жизни. Секреты приватного репозитория не кладут в публичный composer.json. Плагины и scripts Composer способны выполнять код, поэтому их включение требует понимания источника.

Имя класса связывается с файлом

PSR-4 для небольшого магазинаФрагмент или команда
{
  "name": "example/practical-shop",
  "require": { "php": "^8.2", "ext-pdo": "*" },
  "autoload": { "psr-4": { "Shop\\": "src/" } },
  "autoload-dev": { "psr-4": { "Shop\\Tests\\": "tests/" } }
}

Файл composer.json. Для конкретной базы добавьте нужное расширение, например ext-pdo_mysql. Для SQLite-тестов понадобится pdo_sqlite. После изменения правил автозагрузки выполните composer dump-autoload.

Класс из src и использование автозагрузчикаСамостоятельный пример
<?php
declare(strict_types=1);

namespace Shop;

final class DeliveryPrice {
    public function forSubtotal(int $subtotalMinor): int {
    if ($subtotalMinor < 0) throw new \InvalidArgumentException('subtotal');
        return $subtotalMinor >= 500000 ? 0 : 39000;
    }
}

echo (new DeliveryPrice())->forSubtotal(100000)."
";
Ожидаемый результат
39000

Самостоятельный файл демонстрирует namespace и класс. В проекте класс лежит в src/DeliveryPrice.php, а public/index.php подключает require dirname(__DIR__)."/vendor/autoload.php" и создаёт Shop\DeliveryPrice. Класс не должен печатать значение при автозагрузке: последняя строка относится только к демонстрации.

PSR-4 сопоставляет префикс Shop\ с каталогом src. Полное имя Shop\Catalog\ProductRepository соответствует src/Catalog/ProductRepository.php. Регистр пути важен на Linux, даже если ошибка незаметна на Windows. use создаёт псевдоним имени в текущем файле, но само по себе не загружает файл. Автозагрузчик вызывается, когда PHP действительно нужен ещё неизвестный класс.

Пространство имён не создаёт границу безопасности и не делает объект singleton. Оно предотвращает столкновение имён и помогает организовать код. Функции и константы имеют отдельные особенности разрешения имён; не рассчитывайте, что PSR-4 автоматически загрузит произвольную функцию. Для общих файлов функций есть autoload.files, но каждый такой файл выполняется при подключении автозагрузчика, поэтому побочные эффекты там особенно нежелательны.

Обновление проходит тесты до релиза

Обычный цикл работы с зависимостямиФрагмент или команда
composer validate --strict
composer install
composer audit
composer check-platform-reqs
# Для production-сборки из проверенного lock:
composer install --no-dev --prefer-dist --optimize-autoloader --no-interaction

Команды выполняют в копии проекта с установленным Composer. Это инструкция, не автоматически выполненная установка. Audit проверяет известные advisories и не доказывает отсутствие уязвимостей. Параметры scripts/plugins выбирают по политике проекта.

Обновляйте зависимости в отдельной ветке, читайте изменения и запускайте тесты с реальной версией PHP. Ограничение ^8.2 допускает совместимые версии ветки 8, но библиотека и используемый синтаксис всё равно должны тестироваться на минимально заявленной версии. Не скрывайте несовместимость через --ignore-platform-reqs: это может дать успешную установку и падение в первом запросе.

В dev устанавливают инструменты тестов и анализа, в production-сборке обычно исключают require-dev. Но если приложение ошибочно использует dev-зависимость в рабочем коде, оно упадёт после --no-dev. Поэтому тестируется и готовый production-артефакт. Оптимизация автозагрузки уменьшает поиски файлов, а authoritative classmap требует осторожности с динамически создаваемыми классами.

Что хранить в репозитории и что выдавать веб-серверу

В репозитории приложения нужны исходники, composer.json, lock, миграции и тесты. Каталог public содержит только публичную точку входа и статические ресурсы. src, vendor, конфигурация и секреты находятся выше webroot. Сам факт расширения .php не защищает файл при ошибке конфигурации сервера: правильный корень уменьшает последствия.

В команде зафиксируйте команды установки, тестирования и сборки в README/CI. Новый разработчик должен получить воспроизводимую среду, а не угадывать версию пакета по чужому vendor. Для библиотеки политика lock может отличаться от приложения, потому что важно тестировать диапазон зависимостей пользователей. Здесь рассматривается именно развёртываемое веб-приложение.

Версии, расширения и проверка готовой сборки

Ограничение версии библиотеки выражает допустимый диапазон, а не обещание, что любой update не потребует внимания. Изменения транзитивной зависимости тоже способны повлиять на поведение. Просматривайте diff lock-файла, changelog существенных пакетов и результаты тестов. Не обновляйте десятки несвязанных компонентов одновременно без необходимости: причину регрессии будет труднее выделить.

Расширение PHP — не обычный пакет vendor. Указание ext-curl или ext-intl в require проверяет наличие, но не устанавливает системную библиотеку автоматически. В контейнере или серверном образе расширения и их системные зависимости готовят отдельным этапом. Composer check-platform-reqs проверяет реальную платформу, что особенно важно при использовании config.platform для разрешения зависимостей.

Артефакт после --no-dev должен запускаться самостоятельно с production-конфигурацией. Проверяйте автозагрузку всех точек входа, включая CLI-команды и воркеры. Иногда сайт работает, а ночной импорт падает, потому что его класс случайно находился в autoload-dev. Такой сбой обнаруживается тестом собранного артефакта, а не только тестами исходной dev-копии.

Практика: проверьте решение, а не только успешный путь

После переноса с Windows на Linux класс Shop\Catalog\Product не найден, хотя файл существует как src/catalog/product.php. Что исправлять?

Разбор решения

Согласовать регистр namespace, имени класса, каталогов и файла с PSR-4, затем пересобрать автозагрузку. Добавление require в случайный контроллер маскирует проблему. В CI полезен Linux-запуск, чтобы поймать ошибку до production.

Источники и обсуждения

Код и руководство с собой

Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.

Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.

Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.