Эта глава посвящается проблемам объектно-ориентированного программирования (ООП) и реализации объектов в PHP. Даже если вы считаете себя ветераном программирования PHP, то все равно можете найти в этой главе для себя много нового и поучительного. Если же вы новичок в PHP, эта глава может оказаться для вас слишком сложной, поэтому вы можете пропустить ее и вернуться к ней позднее. Функциональность, которая здесь обсуждается, полезна, но необязательна для решения большинства задач программирования.
6.1. Объектно-ориентированное программирование
ООП было разработано для решения проблем, связанных с написанием больших программных проектов, в котором участвует команда программистов. Когда исходный текст программ превышает тысячи строк кода, внесение любого изменения может вызывать самые неожиданные побочные эффекты. Так происходит, когда модули формируют "своеобразные секретные союзы", как, например, это делали государства в предвоенной Европе (имеется в виду Первая Мировая война).
Представьте себе модуль, предназначенный для регистрации в системе, который позволяет модулю обработки кредитной карточки обрабатывать ее подключение к базе данных. Наверняка это делалось с наилучшими намерениями, вероятно, для того, чтобы избежать перегрузки, связанной с созданием другого подключения. Позднее в модуле регистрации было нарушено соглашение и изменено имя переменной. В результате программный код работы с кредитными карточками будет работать неправильно; этот модуль, а вслед за ним и модуль, обрабатывающий счета, а скоро и другие, никак не связанные с ними модули, тоже перестанут корректно работать.
Но здесь я немного сгущаю краски. Большинство программистов используют технологии сцепления (coupling) и инкапсуляции (encapsulation). Сцепление определяет меру взаимозависимости двух модулей, и чем оно меньше, тем лучше. Хотелось бы брать уже готовые модули из существующих проектов и использовать их повторно в новых проектах. Хотелось бы вносить общие изменения в существующие модули, не заботясь при этом о том, как они воздействуют на другие модули. И выход есть: воспользоваться уже существующим принципом инкапсуляции. Модули можно рассматривать как отдельные независимые государства, и обмен между модулями должен осуществляться через узкие, структурированные интерфейсы. Модули не должны "шпионить" друг за другом, "выведывая" друг у друга значения переменных. Они должны "вежливо" запрашивать их посредством функций.
При наличии определенного уровня дисциплины программирования принцип инкапсуляции применим к любому языку программирования. В PHP и других процедурных языках имеется множество соблазнов для пренебрежения этим принципом, и ничто не может помешать разработчику сплести паутину заговора между модулями. Благодаря ООП нарушить принцип инкапсуляции совершенно невозможно.
В ООП модули объединяются в объекты, которые имеют методы (methods) и свойства (properties). С абстрактной точки зрения методы представляют собой сущности, представленные объектом, а свойства являются характеристиками объекта. С точки зрения программирования методы - это функции, а свойства - это переменные. В идеальной объектно-ориентированной системе (ООС) каждая ее часть является отдельным объектом. Система складывается из объектов, обменивающихся объектами с другими объектами, используя при этом методы.
Класс определяет атрибуты объектов. Свойства и методы класса называются элементами. Выражение можно определенным образом квалифицировать, назвав элементы data или method.
Во всех языках при работе с объектами предпринимаются различные подходы. PHP позаимствовал подход языка C++ и предлагает тип данных, который может хранить функции и переменные под одним и тем же идентификатором. Первые выпуски PHP и даже его третья версия не предназначалась для работы с проектами, превышающими 100000 строк исходного текста. Такая возможность представилась с появлением PHP и процессора Zend Engine. Но независимо от размера проекта создание сценариев с использованием классов определенно помогает создать код, который можно использовать повторно. Это неплохо, особенно если вы планируете распространять свой исходный код.
Идея использования объектов - одна из самых прогрессивных идей в компьютерной науке. Ее не легко понять и принять сразу, но, после того как она станет частью инструмента разработки ваших программных приложений, мыслить в терминах объектов становится совершенно естественно. Тем не менее объектами можно пренебречь и вернуться к изучению этой главы позднее. Некоторые встроенные функции возвращают объекты. При этом существуют альтернативные функции, которые не возвращают объекты, или можно преобразовывать объекты в массивы так, как описывается в конце этой главы.