Программа самостоятельного изучения PHP. Часть 1
Давно я вынашивал идею создания курса по изучению одного из самых популярных языков Web-среды разработки — PHP. Проанализировав количество предложений по видеокурсам, вебинарам и книгам, я понял, что делать ещё один курс не имеет смысла.
Но по коммерческим причинам за бортом информационного крейсера остались те, кто изучает программирование самостоятельно, комбинируя различные источники информации. Поэтому, если вы начинаете учить язык PHP, то я надеюсь, что моя программа вам поможет!
Как это всё читать?
Цели. Данный набор шагов по изучению не даст вам ответы на то, как работает тот или иной инструмент языка или его обвязки. Основная цель состоит в том, чтобы получить чёткое описание пошаговой программы изучения языка с пониманием того, что же получится по итогам.
Средства. Поиск источников информации, данных, выбор технологических решений оставляется на откуп изучающему — он волен сам выбирать, прочитать о технологии из книги, с сайта или посмотреть запись на YouTube. Я постараюсь давать ссылки на материалы, но относитесь к ним именно как к рекомендациям!
Для владеющих английским я настоятельно рекомендую к прочтению статью на Hackernoon, которая отлично раскладывает по полочкам навыки современного веб-программиста.
Уровень входа. Сам курс подразумевает отсутствие опыта программирования до начала изучения. Однако, мы пишем web-приложение, и оно не сможет обойтись без пользовательского интерфейса, который, в свою очередь, базируется на языке разметки HTML и таблицах стилей CSS. Для этого есть отличный ресурс. Там можно изучить эти языки, но сам сайт отлично работает и как справочник, так что можно будет к нему обращаться по мере изучения языка.
Содержание. Каждый блок состоит из нескольких частей: 1. Название части блока и задачи. 2. Постановка цели части блока. 3. Описание практической части, которую необходимо выполнить для того, чтобы усвоить информацию. 4. Описание получаемой ценности. 5. Комментарии и сопутствующие ссылки. 6. Практика. Как видите, каждый блок изучения имеет практическую часть. Запомните:
Просто читать о технологиях, не практикуясь в их применении, бесполезно! Без практики можете сразу забыть об обучении и не тратить драгоценное время!
Временные рамки. Если у вас есть полный рабочий день из 8 часов, который вы можете посвящать обучению, то на первый блок у вас должна уйти неделя непрерывного обучения. Разумеется, кто-то будет совмещать всё с основной работой, но как и с любым обучением я рекомендую посвящать не менее 1.5 часов в день изучению и практике. В идеале — 2-3 часа. Этого хватит для того, чтобы вникнуть в тему, изучить материал и попрактиковаться. Разумеется, при таком подходе изучение первого блока займёт гораздо больше 1 недели, но у вас в первом приоритете должно быть качество, а не скорость!
Блок 1. Знакомство с языком. Первое приложение
Итак, начнём. Стремиться будем к тому, чтобы получить работающее приложение. Данный блок посвящён процедурному программированию и пока не рассматривает объекты. Основная цель — познакомиться с фундаментальными вещами.
Часть 1. Введение и базовые понятия
Задача: Установка окружения и запуск PHP.
Цель: Готовимся к работе с языком и средой.
Ценность: Мы готовим себе среду, в которой начнём изучать язык. Без неё продвинуться вперёд не получится.
Практика: 1. Узнать, как работает сайт с применением PHP — разобраться, как приходит запрос, как он передаётся веб-серверу, как он передаётся PHP на выполнение. 2. Установить сборку OpenServer/XAMPP. 3. Установить ПО для написания кода.
Комментарии. Пока мы ставим упрощённую сборку, которую затем заменим на более «продвинутый» вариант (виртуальную машину или контейнер). Сейчас нужно сконцентрироваться на PHP.
Для начала работы я рекомендую использовать обычные блокноты с подсветкой, например, Notepad++ или Sublime, а не IDE. Дело в том, что IDE будут давать подсказки, не давая нарастить опыт в самостоятельном поиске ошибок и их устранении.
Полезные материалы:
- справочник HTML/CSS;
- что потребуется для запуска PHP-скриптов?
- ещё о работе PHP;
- лучшая книга для начала изучения PHP.
Часть 2. Переменные, типы
Задача: Написать первый простой скрипт
Цель: Первые шаги в программировании.
Ценность: Начинаем писать настоящий код и запускать его. Ни один PHP-скрипт не работает без переменных. Более того, типизация переменных — важная тема, которая не только полезна в работе, но и крайне интересна интервьюерам на собеседованиях!
Практика: 1. Понять, что такое переменные. 2. Познакомиться с типами переменных. 3. Узнать, что такое typehinting в PHP7. 4. Узнать про приведение типов и их преобразование. 5. Узнать про правильное именование переменных. 6. Реализовать простые математические операции. 7. Константы. 8. Использование комментариев.
Комментарии. Помимо того, что переменные вообще можно создавать и использовать, немаловажным моментом является корректность их использования. Например, применение дробной переменной там, где используются целочисленные значения не только приведёт к ненужным накладным расходам, но и может дать неожиданный результат по итогам работы скрипта.
Также важно осознать, почему имена переменных типа «asd» и «massiv_chisel» так нелюбимы профессиональными разработчиками.
Полезные материалы:
- Роберт Мартин — «Чистый код»;
- официальная документация про переменные;
- базовый стандарт оформления кода в PHP.
Часть 3. Функции
Задача: Учимся повторному использованию кода.
Цель: Сделать код нелинейным и повторно применяемым.
Ценность: Функции — основополагающая часть любого приложения, которое dы хотите использовать больше 15 минут. Без них нельзя работать ни с объектами, ни со стандартным поведением.
Также мы знакомимся с принципом DRY, который поощряет использование функций.
Практика: 1. Узнать, что такое DRY. 2. Познакомиться с функциями. 3. Посмотреть, какие переменные и в каком количестве можно передавать в функции. 4. Что такое возвращаемое значение? Как оно происходит? 5. Что такое передача аргументов по ссылке? 6. Что такое статические и глобальные переменные? Чем плохи глобальные переменные? 7. Узнать про про правильное именование функций (см. Роберт Мартин — «Чистый код»). 8. Узнать и научиться правильно применять рекурсию (классическая задача — вычисление ряда Фибоначчи или возведение числа в степень). При изучении массивов нужно будет вернуться к вопросам рекурсии. 9. Изучить синтаксис комментариев PHPDoc.
Комментарии. Первый сложный для понимания блок, «ломающий мозг», если до этого с функциями не сталкивались. Главное здесь — осознать назначение функций, а также научиться их правильно создавать. Эта часть обучения очень важна для последующих шагов.
Полезные материалы:
- DRY и другие важные принципы;
- официальная документация про функции;
- Хабр про рекурсию;
- Хабр про PHPDoc.
Часть 4. Ветвления
Задача: Учимся менять логику в зависимости от состояния и внешних воздействий.
Цель: Увеличиваем нелинейность кода и создаём разветвляющуюся логику.
Ценность: Ветвления позволяют делать код гибким, а логике дают возможность меняться в зависимости от внешних условий. Этот подход лежит в основе многих современных практик программирования. Без ветвлений невозможно создать даже простой блок логина пользователя.
Практика: 1. Познакомиться с блок-схемами и тем, как они описывают различные логические схемы. 2. Познакомиться с конструкциями if, if-else, if-else if-else. В качестве условий можно брать математические операции сравнения. 3. Познакомиться с конструкцией switch. 4. Насписать код, который будет генерировать случайное число от 1 до 3. В зависимости от сгенерированного числа будет вызываться одна из трёх созданных вами функций. 5. Познакомиться с тернарным оператором. Чем тернарный оператор в PHP 7 отличается от него же, но в PHP 5? 6. Что такое статические и глобальные переменные? Чем плохи глобальные переменные? 7. Узнать, какие условия возможны в PHP. Что такое empty, isset, !empty ? 8. Что такое «==» и «===»? Чем они отличаются?
Комментарии. С ветвлениями нужно быть аккуратными. Они предоставляют мощный механизм построения логических конструкций, но с ними можно быстро скатиться в спагетти-код. Поэтому всегда тщательно проектируйте ветвления вашей программы, чтобы она была читаемой и поддерживаемой.
Полезные материалы:
- совсем просто про блок-схемы;
- блок-схемы отлично описываются Википедией;
- официальная документация про ветвления;
- что такое спагетти-код?
Часть 5. Массивы
Задача: Знакомимся с первой структурой хранения данных.
Цель: Узнаём о том, что наборы переменных можно объединять в структуры.
Ценность: Множество действий в программировании делается не с простыми (скалярными) переменными, а с применением сложных структур. Например, мы попробуем взаимодействовать с хранилищем в виде CSV-файла. Но что, если нам надо поработать с выборкой из 3 строк в одном случае и из 7 — в другом. Нам нужен динамический набор однообразных данных. И эту задачу (и далеко не только её) отлично решают массивы.
Практика: 1. Узнать, что такое массив. 2. Познакомиться с индексными и ассоциативными массивами. 3. Узнать, что такое многомерные массивы. 4. Слить два массива при помощи array_merge. 5. Что такое array_shift, array_pop, explode, implode? 6. Обратить внимание на полный и сокращённый синтаксис объявления массивов.
Комментарии. Урок идёт в тесной связке со следующим уроком. Лучше всего изучать их вместе для лучшего понимания.
Полезные материалы:
Часть 6. Циклы
Задача: Учимся множественному повторению действий.
Цель: Объединить вместе знания о переменных, массивах и функциях, научиться эффективно пользоваться наборами данных.
Ценность: Мы познакомились с большой и важной частью процедурного программирования. Она будет полезна практически всегда. Изученная группа создаёт 90 процентов исполняемого кода. Далее уже начинаются прикладные вопросы, решающие конкретные задачи, тогда как пройденный выше блок будет характерен практически для каждого языка программирования.
Практика: 1. Познакомиться с циклами while, do-while, for. Понять, что for вполне достаточно (нужно начиться заменять while и do-while при помощи for). 2. Вывести на экран разные циклы. (см. FizzBuzz). 3. Узнать, что такое бесконечный цикл, а также конструкции break и continue. 4. Узнать, что такое цикл foreach. 5. Создать двумерный массив, обойти его вложенными циклами. 6. Взять многомерный массив. Его уже не получится гибко обходить простыми циклами. Нужна рекурсивная функция. Задача: создать массив, хранящий многоуровневое меню сайта в виде [Страница — URL — [ Вложенные пункты в том же виде ] ]. Например, до 5 уровней. При помощи рекурсивной функции сгенерировать на его основании древовидное меню на сайт.
Комментарии. Завершаем с фундаментальными основами. Обязательно уделите время многомерным циклам. Посмотрите на то, как меняется время выполнения программы, если вложенным будет цикл на 1 000, 1 000 000 элементов.
Полезные материалы:
Часть 7. Файлы
Задача: Начинаем выносить данные из оперативной памяти в более стабильные хранилища.
Цель: Научиться работать с примитивным хранилищем данных.
Ценность: PHP плохо умеет сохранять данные между разными вызовами скриптов сам по себе. Это его особенность. Пока мы не умеем работать с базами данных и другими хранилищами, но уже научимся сохранять информацию в самый простой носитель — файл.
Для чтения же нужно что-то чуть усложнённое, а значит понадобится структура, в качестве которой выступает формат CSV.
Реализация простой фотогалереи с выводом фотографий из указанной папки поможет окончательно закрепить знания в работе с файловой системой.
Практика: 1. Поработать с простыми файлами — почитать и позаписывать данные. 2. Научиться записывать в файл логи выполнения программы (записать в файл содержимое переменной). Какие режимы работы с файлами существуют? 3. Научиться работать со структурированной информацией — CSV-форматом. 4. Научиться получать списки файлов в директориях и сформировать фотогалерею из файлов, лежащих в указанной папке. 5. Узнать про разницу между абсолютными и относительными адресами. 6. Узнать, что такое домашняя директория сайта, домашняя директория хоста, корневая директория. Чем они отличаются? Когда они нужны? 7. Посчитать слова в файле (считать, что слово — это часть текста, отделённая пробелом или знаком препинания). 8. Как подключать файлы с кодом? В чём разница между include и require? Зачем им _once? 9. Настроить окружение так, чтобы все запросы, кроме запросов к статическим файлам, направлялись к index.php. 10. Зачем нужна такая архитектура? Что такое «человеко-понятный URL»?
Комментарии. Решаем сугубо прикладные задачи. Обратите особое внимание на последнюю задачу — создание т. н. единой точки доступа в приложение. Такой подход впоследствии вы встретите во многих приложениях и фреймворках. Его нужно освоить и понять, в чём его суть.
Полезные материалы:
Часть 8. Обработка форм
Задача: Учимся работать с пользовательским вводом.
Цель: Научиться делать наше приложение интерактивным.
Ценность: Формы — это один из немногих способов получения данных от пользователя. Работать с ними — важно. Но не менее важно, чтобы эта обработка была безопасной. Главная идея, которую нужно вынести отсюда — «любые данные, поступающие от пользователя извне, априори опасны, и их надо обязательно проверять и готовить к обработке, прежде чем впускать внутрь системы».
Практика: 1. Узнать про методы HTTP (GET, PUT, POST, DELETE и т. д.) Чем они отличаются? Чем HTTPS отличается от HTTP? Что такое заголовки? Какие статусы ответа может возвращать сервер? 2. Посмотреть, как создать форму на HTML, которая будет отправлять данные к скрипту script.php. 3. Узнать, что такое суперглобальные массивы $_REQUEST, $_POST, $_GET, $_FILE. 4. Обработать данные от формы и записать их в файл. 5. Узнать, что такое валидация данных (очень хорошо, если удастся разобраться с регулярными выражениями — например, как проверить, что введённый адрес является корректным email-адресом?) 6. Узнать, как защититься от XSS, CSRF атак. Почему и как нужно защищать формы? 7. Узнать, что так CAPTCHA. 8. Научиться загружать файл на сервер. 9. Улучшить фотогалерею — теперь человек сам загружает файлы изображений. Кстати, а точно ли он загружает изображение, а не файл с вирусом?
Комментарии. Обработать форму довольно просто, но гораздо сложнее обеспечить безопасность работы, ведь, к сожалению, пользователи не на 100 % настроены дружелюбно по отношению к вашему приложению. Поэтому важно не просто принимать данные к обработке.
Полезные материалы:
Часть 9. Простая работа с базами данных
Задача: Структурируем хранение данных.
Цель: Файлы — это хорошо, но совершенно неоптимально.
Ценность: Файлы неудобны для хранения тем, что поиск данных в них усложнён и требует создания дополнительного функционала. Сама работа с ними достаточно медленная и тяжеловесная. Базы данных решают не только эту проблему, но и проблему структурирования данных в системе.
Практика: 1. В сборке, установленной на 1 занятии, есть СУБД (скорее всего MySQL). Научиться подключаться к ней при помощи клиента. Например, HeidiSQL. 2. Научиться создавать простые таблицы с данными. 3. Узнать, что такое 3-нормальная форма и как она реализуется на примере таких структур как библиотеки, новостные сайты, свойства товаров. 4. Изучить простейшие команды выполнения запросов — SELECT, INSERT, UPDATE, DELETE. 5. Усовершенствовать обработку формы обратной связи — сохранять полученные данные в БД. 6. Что, если в форме передаются файлы? Как их привязать к отзыву? 7. Узнать, что такое SQL-инъекция. Как её избежать?
Комментарии. Практически ни одно современное приложение не обходится без хранилищ. Пока учимся самым простым вещам, чтобы потом их сделать интереснее и сложнее.
Полезные материалы:
Часть 10. Сессии и cookie
Задача: Сохраняем состояние пользователя между запросами.
Цель: Позволить пользователю видеть свою информацию между шагами работы на сайте.
Ценность: Поскольку скрипты PHP постоянно умирают, нужно как-то сохранять их состояние. Можно делать это и в БД, но это неудобно и дорого. Механизм сессий позволяет привязывать пакет данных к пользователю на протяжении его работы с системой. Cookie помогают пользователю проще идентифицировать себя перед сервером.
Практика: 1. Познакомиться с механизмом сессий. Выяснить, сколько хранится сессия, как ею управлять. 2. Создать форму авторизации. Логика простая — человек вводит пару логин пароль. После этого его состояние можно сохранять в базе данных и в сессиях. 3. Узнать, почему нельзя хранить пароль пользователя в открытом виде. Узнать, что такое хэш (md5, blowfish, crc32, base64). 4. Научиться сохранять в сессии данные о пользователе после авторизации. Например, создать два скрипта PHP, и показывать на них имя пользователя в случае, если пользователь авторизован. 5. Познакомиться с механизмом Cookie. Чётко понимать, что можно хранить в них, а что нельзя. Почему Cookie — небезопасное хранилище? 6. Реализовать функционал «Запомнить меня» в форме логина.
Комментарии. Завершающая часть, которая позволяет нам работать с каждым пользователем персонально. Уже после неё можно привязывать к пользователю «Корзину» в интернет-магазине, создавать личные кабинете и т. п.
Полезные материалы:
Часть 11. Первое приложение
Задача: Написать первое приложение.
Цель: Вспомнить всё!
Ценность: Не просто же так корпели над блоком?
Практика: 1. Создаём приложение «Личный блог». Пока всё будет очень просто. 2. Модуль «Авторизация». Человек может залогиниться на сайте по заранее созданным логину и паролю, хранимым в БД. 3. Модуль «Роли». Человек может быть анонимом, читателем и админом. Читатель может отправлять сообщения через форму обратной связи. Админу доступна страница создания новых статей (форма). 4. Итого на сайте должны быть следующие страницы: главная со списком статей (например, myblog.com), страница статьи (например, myblog.com/article?id=4 или myblog.com/article/4), страница обратной связи (например, myblog.com/feedback), страница создания статьи (например, myblog.com/new) 5.* Попробуйте улучшить страницу создания новой статьи так, чтобы можно было ещё и редактировать существующие статьи.
Справились?
Да, самостоятельное обучение — это довольно сложный процесс. Но оцените, как приятно ощущается своё первое приложение!