Глава 1 · С нуля
Программа обучения: от переменной к работающему сервису
18 этапов: первый запуск, переменные, условия, массивы и функции, затем работающий сервис. Задания, критерии готовности и переходы к главам.
Выберите результат, который хочется получить
Учиться через всё более полезные результаты
Начинаем с данных одной корзины и постепенно собираем сервис, принимающий и отправляющий информацию.
- Показать и посчитать
Переменные → массив товаров → цикл → собственная функция расчёта.
- Принять и сохранить
Форма → проверка → безопасный вывод → база данных.
- Соединить и развивать
HTTP/JSON → клиент API → объекты с настройками → тестируемый сервис.
Каждый этап ниже содержит практическое задание и критерий готовности. Если уже умеете решать задачу, переходите к следующей; непонятные термины открывайте по ссылкам прямо из объяснения.
Не обязательно заранее знать названия всех функций. Начните с понятной цели: форма на своём сайте, отчёт из CRM, приём показаний устройства или обработка каталога. Сначала посмотрите, что получится, затем проходите нужные ступени маршрута. Каждая ступень даёт маленький проверяемый результат, который можно перенести в собственный проект.
- Принять обращение на сайте и сохранить его в базе
- Принять показания мини-ПК и ответить ему
- Получить список сделок одной строкой и собрать интеграцию
- Передать расчёт Python или Node.js из PHP
Если вы впервые открыли PHP, начните с первого шага: маршрут не предполагает, что вы уже умеете объявлять переменные, писать циклы и функции. Не требуется сразу понимать устройство всех клиентов и хранилищ: возвращайтесь к нему после первого работающего результата. Краткие карточки функций помогут быстро вспомнить синтаксис, а главы объяснят, когда он нужен.
Маршрут разработки небольшого магазина
Учиться PHP удобно на одном небольшом сервисе: он принимает товары поставщика, собирает корзину, оформляет заказ и показывает результат. Каждый этап ниже добавляет реальное действие, а не новую синтаксическую конструкцию ради самой конструкции. Скорость прохождения не важна: переходите дальше, когда можете воспроизвести результат и объяснить ошибочный случай.
Для первого прохода используйте локальные данные и тестовые реализации. Это позволяет увидеть правила программы без регистрации у платёжного провайдера или доступа к боевой базе. Сеть и внешние побочные эффекты подключаются после того, как договор данных и обработка ошибок понятны.
01. Запустить первую строку PHP
Что делаем. Создайте hello.php с <?php и echo. Запустите его из терминала, затем откройте через локальный сервер. Сравните исходный файл и отправленный браузеру результат.
Когда этап освоен. Можете объяснить, где выполняется PHP, зачем нужен открывающий тег и почему браузер получает результат.
Практика. Измените вывод на название своего магазина. Уберите точку с запятой и прочитайте ошибку; затем верните её.
Разделы: Начало: первый PHP-файл, страница и данные формы · Установка PHP: от исполнителя до первой локальной страницы · Конфигурация PHP: найти настройку, понять область и проверить результат · Базовый синтаксис PHP: теги, инструкции, HTML и комментарии · Понятный код: имена, отступы и комментарии
02. Сохранить и изменить значение
Что делаем. Назовите переменную $productName, присвойте строку и выведите её. Отдельно задайте целое количество, измените значение и сравните типы через var_dump.
Когда этап освоен. Различаете имя переменной и её значение, присваивание и вывод, строку "0" и число 0. Не используете синтаксис, значение которого пока не можете объяснить.
Практика. Сначала создайте две независимые переменные, затем константу порога доставки. Объясните, что можно менять и почему.
Разделы: Переменные PHP с нуля: имя, значение и область видимости · Типы данных: значения, преобразования и проверка · Константы: одно имя для неизменного правила
03. Посчитать и выбрать действие
Что делаем. Сложите цену и доставку. Сравните сумму с порогом через >=, напишите простой if/else. Проверьте =, == и === на маленьких отдельных опытах.
Когда этап освоен. Понимаете, какое выражение даёт число, какое — bool, и какая ветка выполняется. Умеете поставить скобки явно.
Практика. Проверьте три суммы: меньше порога, ровно порог и больше. Покажите вывод каждой ветки.
Разделы: Операторы: сравнение, значения по умолчанию и вычисления · Выражения PHP: значение, вычисление и использование результата · Условия и циклы на реальных данных
04. Собрать список и обойти его
Что делаем. Создайте массив из трёх названий, прочитайте элемент по ключу, добавьте ещё один. Выведите список foreach, затем повторите счётное действие через for и while.
Когда этап освоен. Можете нарисовать ключи и значения, показать одну итерацию и назвать условие остановки. Выбираете foreach для готового набора, for для счётчика, while для продолжения по условию.
Практика. Соберите два товара с name и price внутри общего массива. Объясните каждую пару скобок при чтении цены.
Разделы: Массивы: списки, словари и выбор операции · Условия и циклы на реальных данных · Ссылки: когда два имени изменяют одно значение
05. Передать данные в функцию и получить результат
Что делаем. Сначала вызовите функцию без параметров. Затем передайте цену и количество через аргументы. Верните произведение через return, сохраните его в переменную и отдельно выведите.
Когда этап освоен. Можете указать имя, параметры, аргументы, тело и return. Понимаете, что echo выводит, а return отдаёт результат вызывающему месту.
Практика. Вызовите расчёт дважды с разными числами и убедитесь, что локальные переменные не смешались. Затем добавьте доставку со значением по умолчанию.
Разделы: Функции: контракт, параметры и результат · Область видимости: аргументы, global и состояние · Замыкания, callback и стрелочные функции
06. Рассчитать стоимость заказа
Что делаем. Задайте цену в копейках, количество и стоимость доставки. Рассчитайте сумму, добавьте условие бесплатной доставки от заданного порога.
Когда этап освоен. Есть проверки нуля, границы порога и отрицательного количества. Строка "0" не теряется из-за empty(). Цена хранится в целых минимальных единицах.
Практика. Измените порог в одном месте. Если он повторяется во многих условиях, выделите настройку и объясните её единицу измерения.
Разделы: Типы данных: значения, преобразования и проверка · Операторы: сравнение, значения по умолчанию и вычисления · Условия и циклы на реальных данных
07. Выделить понятные функции
Что делаем. Отделите расчёт корзины от echo и чтения формы. Пусть функция принимает товары и правило доставки, а возвращает итог.
Когда этап освоен. Одинаковые входные данные дают одинаковый результат; функция не читает скрытую глобальную корзину. Вы понимаете различие return и вывода.
Практика. Напишите тест двух заказов подряд. Объясните, почему локальное static-состояние или изменение global может связать эти вызовы.
Разделы: Функции: контракт, параметры и результат · Область видимости: аргументы, global и состояние · Замыкания, callback и стрелочные функции
08. Принять каталог поставщика
Что делаем. Разберите заранее сохранённый JSON ответа API. Проверьте форму данных, id, цены и массив вариантов. Постройте индекс товаров по id и дерево категорий.
Когда этап освоен. Обработаны отсутствующий ключ, null, пустой список, строка вместо массива, некорректный JSON и слишком глубокое дерево. Ошибка содержит путь к полю.
Практика. Сравните один индекс по id с повторным поиском по всем товарам для каждой строки заказа. Объясните, где возникает O(n×m).
Разделы: Многомерные массивы: от списка внутри списка до обхода неизвестной глубины · Массивы: списки, словари и выбор операции · Рекурсия: категории, меню и обход деревьев
09. Подготовить тексты, даты и файлы
Что делаем. Сделайте отчёт по заказам: понятные подписи, даты с часовым поясом, CSV с корректными кавычками. Для больших файлов используйте последовательное чтение.
Когда этап освоен. Сохраняются кириллица и пустые значения; отчёт не зависит от случайного часового пояса сервера; ошибка открытия файла обработана.
Практика. Добавьте строку с запятой, кавычкой и переводом строки. Проверьте реальное чтение CSV обратно, а не только красивый вывод.
Разделы: Строки, Unicode и безопасное отображение · Регулярные выражения: точная грамматика и пределы · Дата и время: часовые пояса, интервалы и реальные сроки · Файлы, пути, CSV и потоковая обработка · Потоки, обёртки и контексты: читать и писать данные по шагам
10. Понять запрос и принять форму
Что делаем. Создайте форму обращения и пройдите весь цикл GET → POST → проверка → сохранение → 303 → GET. Проверяйте типы до trim, длины до дорогой обработки.
Когда этап освоен. Форма отклоняет массив вместо имени, неверный CSRF-токен и недопустимый email. При ошибке сохраняет корректные поля и показывает сообщения рядом с ними.
Практика. Повторите POST и обновите страницу результата. Объясните разницу между PRG, CSRF и защитой от повторной операции: это разные задачи.
Разделы: Как PHP обслуживает запрос: от браузера до ответа · Суперглобальные переменные: откуда PHP берёт данные запроса · Формы: безопасный приём, ошибки полей и повторная отправка · Самостоятельный проект: форма обращения от GET до базы
11. Добавить пользователя и защиту
Что делаем. Разберитесь, где нужна аутентификация, а где проверка прав. Хешируйте пароль специальной функцией, настройте сессию и отдельно проверьте загрузку файлов.
Когда этап освоен. Пароль не попадает в журнал. Идентификатор записи из формы не даёт права изменить чужую запись. HTML экранируется при выводе в правильный контекст.
Практика. Попробуйте изменить id заказа на чужой. Сервер обязан проверить владельца независимо от того, была ли кнопка в интерфейсе.
Разделы: Безопасность: границы доверия, доступ и контекст вывода · Сессии и вход: cookies, блокировки и смена идентификатора · Загрузка файлов: проверка содержимого, хранение и выдача
12. Сохранить заказ в базе
Что делаем. Создайте таблицы заказов и строк. Используйте подготовленные запросы, белый список полей сортировки и транзакцию для связанных изменений.
Когда этап освоен. Воспроизводимы успех и откат при ошибке второй операции. Повтор одного ключа операции не создаёт второй заказ. Гонка за последний товар разобрана отдельно.
Практика. Запишите момент внешней оплаты на схеме. SQL-транзакция не откатывает уже отправленный HTTP-запрос; изучите outbox и идемпотентность.
Разделы: SQL и PDO с нуля: база, таблица, данные и каталог на странице · Транзакции, гонки и идемпотентность заказа
13. Интегрироваться с внешним сервисом
Что делаем. Используйте тестовый ответ поставщика, ограничьте время ожидания и размер. Разделите транспортную ошибку, HTTP-статус и ошибку формата JSON.
Когда этап освоен. Есть ограничение числа повторов и общей длительности, обработка 429, безопасная политика повторов и проверка подписанного webhook по исходным байтам.
Практика. Замените реальный sleep в тесте записывающей функцией ожидания. Убедитесь, что тест проверяет порядок и длительность пауз, не тратя минуты.
Разделы: Интеграции: HTTP-клиент, JSON и контролируемые ошибки · Паузы, лимиты API и повторные попытки · Webhook: подпись, повторы и порядок событий
14. Перенести правила магазина в объекты
Что делаем. Выделите Product, Cart и Order. Конструктор допускает только корректное начальное состояние; изменение заказа происходит через осмысленные методы.
Когда этап освоен. Нельзя незаметно установить отрицательную цену или оплатить уже отменённый заказ. Вы можете показать, какое состояние хранит каждый конкретный объект.
Практика. Создайте две корзины и измените одну. Затем присвойте объект второй переменной и объясните, почему это уже не две независимые корзины.
Разделы: Зачем ООП: от корзины в массиве к правилам магазина · Классы и объекты: состояние, идентичность и методы · Конструкторы и жизненный цикл: объект сразу пригоден к работе · Видимость: public, protected, private и контролируемая запись
15. Выбрать отношения и зависимости
Что делаем. Опишите договор оплаты интерфейсом. Передайте реализации в сервис заказа. Сравните наследование с композицией, абстрактный базовый класс с интерфейсом и трейт с отдельным объектом.
Когда этап освоен. Сервис работает с тестовой оплатой без сети. Подтип сохраняет обещания базового типа. Трейт не прячет подключение к базе в глобальной переменной.
Практика. Добавьте самовывоз без изменения класса заказа. Если требуется условие на каждый конкретный класс, пересмотрите границу ответственности.
Разделы: Интерфейсы: общий договор для оплаты, хранения и тестов · Наследование: подстановка, переопределение и цена связности · Абстрактные классы: общий алгоритм и точки расширения · Трейты: повторное использование кода без скрытых зависимостей · Композиция и DI: собираем сценарий из понятных зависимостей
16. Разобрать тонкие механизмы ООП
Что делаем. Сделайте копию черновика заказа, проверьте вложенные объекты и неизменяемые значения. Смоделируйте состояния enum, поток товаров генератором и ограниченную метаинформацию атрибутом.
Когда этап освоен. Различаются поверхностная копия и намеренная глубокая копия. Вы знаете, почему readonly не замораживает все вложенные объекты, а Fiber сам не делает HTTP неблокирующим.
Практика. Найдите механизм, который не нужен вашему маленькому проекту. Умение объяснить, почему здесь не нужен __call или Reflection, тоже часть навыка.
Разделы: Клонирование: копия заказа, вложенные объекты и PHP 8.5 · static, self и parent: класс, объект и позднее связывание · Магические методы: полезные протоколы и скрытые ловушки · Enum и readonly: допустимые варианты и неизменяемые значения · Итераторы, генераторы, SPL и Fibers: обработка больших наборов · Атрибуты и Reflection: метаданные, маршруты и границы автоматизации
17. Собрать проект и проверить сбои
Что делаем. Соедините зависимости в одной точке, подключите автозагрузку. Проверьте расчёты, отмену, ошибку оплаты и построение HTML-шаблона с безопасным выводом.
Когда этап освоен. Тесты выполняются без боевых ключей, внешних писем и платежей. Неожиданное исключение диагностируется, а посетителю не показывается стек и SQL.
Практика. Измените правило скидки и запустите тесты. Если правка требует переписать HTTP-контроллер и SQL, проверьте смешение ответственностей.
Разделы: Сквозной проект: заказ магазина от входа до оплаты · Composer, пространства имён и автозагрузка · Структура веб-приложения: контроллер, сервис, репозиторий · Тестирование: успешный путь, границы и отказ инфраструктуры · Ошибки и исключения: что ловить и где · ob_start: шаблоны, вложенные буферы и отправка ответа
18. Подготовить к эксплуатации
Что делаем. Измерьте узкое место, число запросов, память и время внешнего сервиса. Настройте окружение, миграции, журналирование и способ отката.
Когда этап освоен. Есть проверка конфигурации, воспроизводимая сборка, план отката и наблюдение за ошибками. Долгая задача выполняется работником очереди с понятной политикой повторов.
Практика. Выполните отказ сервиса на тестовом окружении. Проверьте, что запрос не зависает бесконечно и повтор не создаёт дубль заказа.
Разделы: Производительность: измерения, память и медленные подходы · Запуск в production: PHP-FPM, релизы, cron и очереди
Как работать с примерами
Сначала прочитайте задачу и договор функции: допустимые типы, единицы, результат и ошибки. Затем предскажите вывод, запустите пример и сравните. Изменяйте по одному условию: пустой список, неверный тип, недоступный файл, исключение зависимости. Такой порядок помогает связать поведение с конкретной причиной.
После короткого примера перенесите идею в свой мини-проект. Сохраните один удачный запрос и один ошибочный как тестовые данные. Не копируйте целую архитектуру, пока не можете назвать проблему, которую она решает. Напишите комментарий о принятом решении и его ограничениях: это заставляет проверить собственное понимание.
У самостоятельных примеров есть ожидаемый stdout. У фрагментов HTTP и команд указаны условия запуска. Пройденная проверка синтаксиса не означает, что настроены реальный SMTP, рабочий MySQL и авторизация платёжного сервиса. Эти зависимости нужно проверять в подходящем тестовом окружении.