Продолжу тему, которую начал несколько статей назад. Для тех, кто ещё не бросил изучать язык PHP или только начинает этот путь, я подготовил описание второй части программы самостоятельного изучения.
Первая часть программы.
Временные рамки. Данный блок явно займёт у Вас больше времени, чем первый. При полноценной практике и регулярном обучении я бы рекомендовал ориентироваться на месяц интенсивной работы как минимум. И помните, что у Вас по прежнему в приоритете стоит качество знаний, а не скорость чтения материала!
Содержание
- Блок 2. Часть 1. Объекты и классы.
- Блок 2. Часть 2. Абстрактные классы и интерфейсы.
- Блок 2. Часть 3. Окружение.
- Блок 2. Часть 4. MVC.
- Блок 2. Часть 5. PDO и ORM.
- Блок 2. Часть 6. Конфигурирование, логи, профилирование, исключения
- Блок 2. Часть 7. SOLID, Паттерны.
- Блок 2. Часть 8. Кэширование.
- Блок 2. Часть 9. Git.
- Блок 2. Часть 10. Приложение 2.0.
Блок 2. ООП. Вспомогательные системы.
Во втором модуле программы обучения начинаем работать с ООП и всеми сопутствующими аспектами. Также изучим прикладные и вспомогательные части приложений, без которых в настоящее время не работает практически ни одно современное web-приложение.
Блок 2. Часть 1. Объекты и классы.
Задача: Начало работы с усложнённой структурой кода.
Цель: Разобраться с ООП-парадигмой, понять, чем объект отличается от простой переменной и какая от этого польза.
Ценность: Мы открываем совершенно новый подход к программированию. Это открытие требует серьёзного осмысления, так как зачастую программисты используют объекты, оставаясь в процедурном стиле, что в корне неправильно.
Сразу же учитесь работать со свойствами объекта и его методами, то есть с его состоянием и поведением.
Усложняйте — заставляйте объекты взаимодействовать.
Практика.
- Выяснить, как создаются классы и объекты.
- Разобраться с состоянием объекта, передачей по ссылке. Свойства объекта как отражение состояния.
- Статические свойства и методы — когда они нужны, а когда нет.
- Основные принципы ООП: полиморфизм, инкапсуляция и наследования — что это такое и как реализуется в PHP
- Напишите простую структуру объектов. Например, иерархия геометрических фигур, иерархия сотрудников и т. п. Важно применять наследование, расширяя родительские классы дочерними.
- Ключевые слова static, parent, self, this
- Попробуйте поработать с этой структурой. Какие свойства реально нужны для вызова извне? Что лучше инкапсулировать?
- UML нотация как описание объектных структур.
- Тайпхинтинг в свойствах и методах (PHP 7+)
Комментарии: Этот урок потребует от Вас довольно много времени на вхождение. Не торопитесь.
Полезные материалы:
Блок 2. Часть 2. Абстрактные классы и интерфейсы.
Задача: Знакомимся с важными архитектурными единицами в ООП.
Цель: Начать проектировать на уровне абстрактных сущностей, а не конечных реализаций.
Ценность: Гибкие системы немыслимы без абстракций. И урок позволяет начать работать с ними. Более того — он учит проверять себя на правильность проектирования системы.
Практика.
- Понять, чем отличаются эти две сущности.
- На примере п.4 из прошлого урока подумайте, как можно вынести в абстрактный слой части Вашей структуры.
- Усложняем: применяем полиморфизм. Попробуйте создать массив элементов из Вашей структуры. Обойдите массив циклом. Можно ли работать с каждым элементом массива как с экземпляром его родительского абстрактного класса или же как с интерфейсом? Буквально: можно ли в ожидаемом типе вместо реального класса указать абстрактный класс или интерфейс? Если нет, то как надо переделать Вашу структуру?
- Какие встроенные интерфейсы предоставляет PHP? Как их использовать?
- Познакомьтесь с trait-ами
Комментарии: Гибкие системы немыслимы без абстракций. И урок позволяет начать работать с ними. Более того — он учит проверять себя на правильность проектирования системы.
Полезные материалы:
Блок 2. Часть 3. Окружение.
Задача: Получить гибкое окружение.
Цель: Научиться работать с виртуальными машинами.
Ценность: Готовые сборки хороши для быстрого старта, но совершенно не подходят для работы в реальных проектах, так как не предоставляют гибкой настройки, а также часто работают на отличающихся от сервера ОС, что порождает различного рода ошибки несоответствий.
Vagrant поможет сделать первые шаги в автоматизации сборки.
Composer поможет управлять зависимостями как кодом.
Практика.
- Установить VirtualBox и Vagrant
- При помощи Vagrant получить рабочую виртуальную машину под управлением Linux (рекомендуются Ubuntu или Debian)
- Собрать окружение NGINX+PHP-FPM+MySQL
- Присвоить доменное имя и научить сервер отвечать на него
- Поддержать единую точку входа
- Развернуть свой код в систему
- Настроить IDE на работу виртуальной машиной и запуском скриптов на ней
- Установить Composer
- При помощи Composer установить любую библиотеку и попробовать ей пользоваться.
- Обратить внимание на папку vendor, правила автозагрузки и стандарты PSR-0,4
- Также выяснить, чем отличаются composer.json и composer.lock
Полезные материалы:
Блок 2. Часть 4. MVC.
Задача: Начало работы с фундаменальной архитектурой для web-приложений..
Цель: Разделить приложение на слои для более удобной работы.
Ценность: Любой современный web-фреймворк использует MVC и его разновидности. Поэтому без понимания этой парадигмы далеко не уехать.
Практика.
- Изучить подход. Как реализуется MVC в PHP? Что такое пассивный и активный MVC? Узнать про «уродливый жирный контроллер»
- Front Controller или единая точка входа для реализации MVC, работа с приложением через инстанс (объект) самого приложения
- Структура директорий MVC-проекта
- Роутинг в MVC — как обрабатывать и конфигурировать преобразование адресов в команду приложению
- Создать самое простое MVC-приложение: отображение 2-3 страниц при помощи единой точки входа и MVC
- Разновидности: HMVC, MVP, MVVM
Комментарии: Если есть желание, стоит посмотреть на структуру MVC проектов в сети, чтобы облегчить работу с темой
Полезные материалы:
Блок 2. Часть 5. PDO и ORM.
Задача: Структурировать работу с хранилищем.
Цель: Применить ООП-подход к работе с данными. Выделить запросы и взаимодействия с хранилищем в отдельный слой.
Ценность: Хранилище — важная часть приложения. Однако (в идеале) оно не должно накладывать на логику какие-либо ограничения. Поэтому работу с ним стоит вынести в отдельный слой.
Также стоит отметить обеспечение безопасности при выполнении обновления данных, дабы не допускать SQL и иного рода инъекций.
Практика.
- PDO — создание соединения, запросы, prepare
- Кто должен запрашивать данные: модель или контроллер?
- ORM (Doctrine, Eloquent) — абстрагирование кода от конкретного хранилища. Установить при помощи Composer
- Разделение бизнес-логики в моделях и кода отражения сущностей в БД
- Если поменять MySQL на Postgres Ваш проект с ORM продолжит работать? Что нужно сделать, чтобы продолжил?
- CRUD-операции. Создайте для своего MVC такой функционал, который будет выполнять такую работу.
Приложение — Уровень 2
Полезные материалы:
Блок 2. Часть 6. Конфигурирование, логи, профилирование, исключения.
Задача: Анализировать работу приложения и делать выводы из ошибок.
Цель: Научиться искать причины ошибок, а также обрабатывать нештатные ситуации.
Ценность: Все приложения содержат ошибки. И чтобы с этими ошибками бороться, требуется искать их причины. Логи и профилирование — самые подходящие для этого инструменты.
Конфигурация приложения — это залог гибкости и независимости. Начинаем отвязывать код от сервера, на котором он работает.
Исключения же позволяют не убивать приложение в случае нештатной ситуации, отдавая пользователю некрасивую простыню ошибок, а аккуратно обрабатывать такие вещи.
Практика.
- Установить Xdebug и попробовать создать ситуацию с ошибкой
- Познакомиться с профилированием и Xhprof
- Попробовать написать модуль, который будет записывать содержимое переменных и объектов в указанный файл лога
- Познакомиться с библиотекой Monolog
- Можно ли логировать на проде?
- Конфигурирование приложения — уберите хардкод (заодно узнаете, что это) и настройки приложения в выделенные файлы. Плейсхолдеры в коде
- Механизмы конфигурирования в php — ini-файлы, yaml, xml, json
- Как создать конфигурации для разных окружений Вашего приложения (среда разработки, среда тестирования, боевая среда)?
- Механизм исключений — что такое Exception, try-catch-finally, наследование исключений и их проброс.
- Попробуйте создать режим работы Вашего приложения, при котором исключения будут логироваться (режим должен управляться флагом конфигурации)
Комментарии: Довольно много тем внутри блока, но все они довольно тесно связаны, так что лучше изучать их вместе.
Полезные материалы:
Блок 2. Часть 7. SOLID, Паттерны.
Задача: Структурировать код и классы.
Цель: Научиться пользоваться лучшими практиками проектирования приложений.
Ценность: Вы уже наверняка догадались, что просто так накидать классы и разбросать по ним функционал — не лучшая идея. Именно задачу структурирования решает ООП-подход.
Многие задачи проектирования в современном программировании уже решены. Поэтому будет большой ошибкой не пользоваться многолетними наработками сообщества.
Обратите внимание на то, что не стоит пытаться зазубрить паттерны с одного подхода. Они должны основываться на практике, поэтому в процессе обучения обращайтесь к ним на этапе проектирования кода.
Именно здесь Вы должны осознать, что создание приложения начинается задолго до открытия IDE и написания первого класса.
Практика.
- SOLID — из чего он состоит и как реализуется в PHP. Начните с самого простого — все ли Ваши классы, созданные до этого отвечают букве S в аббревиатуре?
- Singleton — пусть и антипаттерн относительно SOLID, но с него хорошо начинать разбираться в самой сущности паттернов. Напишите прослойку работы с БД при помощи этого паттерна (да, она будет нарушать SOLID, но мы пока учимся)
- Паттерны — не готовый код, а рекомендации! Мы уже успели неявно познакомиться с Front Controller, например.
- Типы паттернов (design patterns, architectural patterns, etc)
- Наиболее популярные и применимые в web: Фабрики, Декоратор, Page Object, DAO, Наблюдатель.
Комментарии: Несмотря на то, что пунктов тут немного, модуль довольно объёмный в плане предстоящей работы.
Полезные материалы:
Блок 2. Часть 8. Кэширование.
Задача: Кэширование.
Цель: Убрать ненужные обращения к медленным источникам.
Ценность: Кэширование — дин из базовых инструментов обеспечения высокой производительности вэб-приложения за счёт перемещения неизменяемых на некоем промежутке времени данных в более быструю область памяти. Важно разобраться с ним, чтобы обеспечивать работу на небольших серверах, да и просто оптимизировать потребление ресурсов.
Практика.
- Когда нужен кэш? БД, API, файловая система. Кэш есть везде. Он должен быть и в Вашем приложении.
- Механизмы кэширования: OPCache, Redis, Memcached
- Что кэшировать и на какой срок? Страницы, блоки данных, значения переменных, результаты запросов
- Прогрев кэша
- Интеграция Memcached и Nginx
- Коллизии
Полезные материалы:
Блок 2. Часть 9. Git.
Задача: Версионирование приложения и контроль изменений.
Цель: Научиться контролировать работу с изменениями кода, а также применять эти изменения или откатывать их.
Ценность: Множество продуктов разрабатывается не в одиночку. И для командной работы процесс управления изменениями просто необходим. Даже при работе в одиночку распространена ситуация, когда нужно откатить изменения до более ранней версси, либо разделить функционал на блоки разработки. Говоря проще: без Git (или иной системы версионирования) в команде работать не получится.
Практика.
Тут я не стал ничего выдумывать, так как для изучения есть отличый онлайн-туториал.
Блок 2. Часть 10. Приложение 2.0.
Итак, Вы готовы усложнить Ваше приложение и написать что-то интересное.
Вы можете создать, например блог. В нём помимо пользовательского представления должен быть интерфейс администратора, система управления банерами и ссылками, роутинг, человеко-понятные URL, кэширование и прочие вещи, которые Вы изучили в рамках данного модуля.
Для того, чтобы Ваш код можно было показать будущему работодателю, Вы можете вести разработку с применением версионирования на базе Github.
Получилось?
Если Вы читаете это, пройдя все модули, описанные выше, Вы готовы к следующему шагу. В 3 модуле изучения я считаю стоящим рассмотреть начало работы с фреймворками, уделить отдельное внимание вопросам Inversion of Control, более глубоко уйти в архитектуру, рассмотреть CI/CD пайплайны.
Если Вам интересны эти и другие темы, жду Ваших отзывов!