Лучший в мире язык для промышленной веб-разработки - PHP. Он прост в освоении, имеет огромную экосистему, быстр, вынослив и кормить совсем не нужно.
Типичный стиль написания кода, используемый в PHP - "объектно ориентированный". На втором уроке по PHP новичок легко осваивает этот принцип и всю жизнь, в меру своей испорченности, использует его.
Отступление для зануд, которое приличные люди могут не читать: PHP является т.н. "Тьюринг-полным" языком, на котором возможно творить любую бесовщину. Мне известно о возможности писать на PHP приложения с окошками для Windows. Я знаю, что есть любители писать на PHP в "функциональном" стиле. Но приличный человек будет копать землю лопатой, а не любимой серебряной ложечкой для чая.
Сегодня мне довелось лицезреть работу серийного убийцы программистов. Я уверен, что человек, писавший эти строки, ответственен за тысячи людей, не выбравших лучшую в мире профессию программиста из-за того, что это "слишком сложно".
Это определение объектно-ориентированного программирования (ООП) из Википедии. Не стоит читать статью полностью, чтобы не обляпаться (предлагаю остановиться там, где вы в первый раз подумаете "что за фигня?"). Я приведу самое начало. Поверьте, дальше еще хуже.
Объе́ктно-ориенти́рованное программи́рование (ООП) — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определённого класса, а классы образуют иерархию наследования.
Идеологически ООП — подход к программированию как к моделированию информационных объектов, решающий на новом уровне основную задачу структурного программирования: структурирование информации с точки зрения управляемости, что существенно улучшает управляемость самим процессом моделирования, что, в свою очередь, особенно важно при реализации крупных проектов.
Управляемость для иерархических систем предполагает минимизацию избыточности данных (аналогичную нормализации) и их целостность, поэтому созданное удобно управляемым — будет и удобно пониматься. Таким образом, через тактическую задачу управляемости решается стратегическая задача — транслировать понимание задачи программистом в наиболее удобную для дальнейшего использования форму.
Человек, писавший эти слова, не хотел объяснить, как работает ООП. Он хотел показать, какой он умный. Там дальше еще больше интересного, кому не хватило:
абстракция - для выделения в моделируемом предмете важного для решения конкретной задачи по предмету, в конечном счёте — контекстное понимание предмета, формализуемое в виде класса;
Ни один нормальный человек не будет это читать по собственной воле. Если после первого урока заставить новичка зубрить эти заклинания, на второй урок он не придет. Есть, конечно, студенты университетов, над которыми можно издеваться как угодно. Они смирились, что в учебниках всегда так.
А теперь воспряньте, ибо я попытаюсь рассказать про практическое применение ООП при разработке на PHP. И вы увидите, что на деле это очень просто.
Предмет
Первый способ использования объектов в PHP - это группировка данных (это "свойства" объекта) для передачи куда-то.
Допустим, нам надо сечь плетьми холопа Питера Заумного, написавшего столь прекрасную статью в Википедии. Потому что этот Заумный Питер приносит больше вреда, чем пользы.
Мы вызываем приказчика и говорим: "этого сечь плетьми на конюшне, он вредитель". Таким образом, приказчик получил команду ("сечь плетьми") и параметры (кого - "вот этого", за что - "он вредитель").
Мы могли бы описать приказчику негодяя, назвав его фамилию, имя, рассказать где его найти и как отличить от его сожителей. Вместо того, чтобы брать на себя всю это работу, мы просто говорим: "этого". Тут уже перепутать невозможно.
В терминах программного кода это разница между функцией "сечь плетьми объектно", которая принимает два параметра: объект и причину. И функцией "сечь плетьми по параметрам", которая принимает множество параметров, описывающих то же самое.
Допустим, в нашем коде функция "сечь плетьми по параметрам" используется с десяток раз по разным поводам. Холопов ведь в строгости держать надобно. И мы хотим, так сказать, обновить функционал: раньше каждому полагалось по 10 плетей, а теперь малолетним по 3, зато взрослым 15.
Получается, теперь необходимо, кроме ФИО, передавать еще и возраст холопа. А это значит, что везде, где мы раньше использовали нашу функцию, мы должны дополнить список параметров. Серьезная переделка! Пожалуй, не нужна нам эта прогрессивность, пусть все, как и раньше, по 10 плетей получают.
При передаче же объекта нам ничего не надо переделывать, кроме инструкции приказчику (тела самой функции): "спроси-ка, любезный, сколько ему лет, и секи в зависимости от этого".
В итоге, при передаче всех параметров, мы берем на себя труд самостоятельно описать все необходимые параметры, в то время как объект сам рассказывает все, что надо, о себе. Если завтра обнаружится, что холопы бывают бритые и небритые, в нашем приказе "этого сечь плетьми" ничего не изменится.
Дополнительная "плюшка", которые мы получаем: объект, при создании, вероятно, проверяется на корректность, и нам нет необходимости каждый раз при работе с ним убеждаться в том, что он вообще существует (вот же он).
Описывая его параметрами, наоборот, легко ошибиться. Например, если мы не сами его видели, а получили описание от кого-то другого (такое часто бывает при работе с данными от пользователя - им только дай волю, они такие данные в формы вводят, что закачаешься). При передаче по параметрам каждая функция вынуждена производить собственную проверку корректности комбинации полученных данных.
Сервис
Второй способ использования объектов в PHP - это группировка "команд" (это называется "методы").
Здесь у нас объект "конюшня" - там умеют разные полезные вещи: сечь плетьми холопа, запрягать лошадь, кормить лошадь, выгребать навоз.
Здесь "кузница", можно: подковать лошадь, изготовить кольчугу, заточить меч, сковать гвоздь.
Если лошадей у нас в хозяйстве нет, конюшня не нужна - её можно не строить. Удобный метод "автозагрузки" позволяет программе загружать только то, что нам нужно прямо во время исполнения.
Конструктор
Когда мы говорим "этого сечь", откуда же взялись все параметры, нужные приказчику для наказания?
Часть из них наш Питер Заумный получил при рождении: имя, фамилию, информацию о родителях. В нашей программе объект был не рожден, а создан при помощи конструктора, специального метода, который записал значения критически важных для существования объекта свойств.
Часть получил в результате каких-то действий: например, наш Питер потерял руку в результате несчастного случая. В результате произошло изменение состояния объекта (свойство "количество рук" уменьшилось).
Конструктор позволяет создать объект по минимальному набору параметров, позволяющих ему существовать. Пусть он пока маленький, ничего не умеет, но у него уже есть имя, фамилия и родители. Плюс некий набор "стандартных" параметров: две руки, две ноги, голова. Наличие кожи конструктор отмечает самостоятельно: нет необходимости описывать объект слишком подробно, когда есть базовая информация о том, как выглядят объекты этого класса.
Создавая объект "конюшня", мы определяем минимально необходимые для создания конюшни вещи: где она будет стоять, сколько будет стойл, кто будет в ней работать и т.д. После чего конюшня готова выполнять свои функции. Если бы мы забыли назначить работников, наши команды не могли бы быть выполнены. Поэтому конструктор объекта должен следить за полнотой предоставленных данных. Это называется валидация.
Все вместе
Нетрудно догадаться, что большинство объектов имеют и свойства и методы. Конюшня имеет размеры, у неё можно спросить, сколько лошадей доступны, а можно использовать её как сервис и дать задание.
Часть действий объект может производить без изменения своего состояния (наказание холопа не влияет на количество стойл или расположение конюшни), а часть действий сами по себе приводят к этому (команда "седлать лошадь" уменьшает число доступных лошадей).
Все это уже относится к практическим вопросам, которые решаются при проектировании системы.
Наследование, статические методы, деструкторы, инкапсуляция, позднее статическое связывание - все эти умные слова можно осознать по мере того, как вы начнете пользоваться объектами. Позже.
Помните - только практика может превратить "чайника" в настоящего PHP-боярина!
Источник