Предлагаемый материал последовательно освещает основные этапы эволюции объектно-ориентированных особенностей PHP.
PHP 3
Любопытно, что изначально PHP вовсе не задумывался как объектно-ориентированный язык. Еще
летом 1997 года у его создателей не было планов по включению в PHP каких-либо объектно-ориентированных возможностей. [4]
Ситуация изменилась 27 августа 1997 года, когда в разрабатываемую версию был включен объектно-ориентированный синтаксис для доступа к ассоциативным массивам. А для широкой общественности первые элементы поддержки ООП стали доступны с выходом в середине
1998 года третьей версии PHP. К тому времени первоначальная идея обросла дополнительными деталями, но все же существующая поддержка ООП не обеспечивала чего-то намного более существенного, чем еще один способ доступа к массивам. Объекты были, по сути, контейнерами для свойств, то есть, мало чем отличались от ассоциативных массивов. [4][5]
Впрочем,
главное отличие, конечно, заключалось в том, что объекты являлись экземплярами классов, а те, в свою очередь, были контейнерами не только для свойств, но и для методов. Объекты можно было создавать при помощи оператора new. Поддерживался даже механизм наследования, что позволяло создавать более специализированные классы без того, чтобы разрабатывать их с нуля или копировать код родительского класса. [4]
PHP 4
Объектная модель, несмотря на ее явную ограниченность и появление нового движка, в четвертой версии не претерпела существенных изменений. Возможно, это случилось из-за выраженного стремления создателей обеспечить обратную совместимость с предыдущей версией [6]. Впрочем, в PHP
4 была добавлена возможность вызывать методы класса как из контекста соответствующего объекта, так и извне его. [4]
Однако, объектная модель в PHP 3 и 4 имела весьма существенный недостаток, что значительно усложняло и ограничивало возможности ее применения. Коротко этот недостаток можно сформулировать следующим образом: передача объектов осуществлялась не по ссылке,
а по значению. Вскоре мы рассмотрим подробнее, что это значит, и почему это так важно (Глава 4, Основное отличие объектной модели PHP 5).
Указанный недостаток отчасти можно обойти, задавая способ передачи явным образом путем использования символа &. К сожалению, это не является полноценным решением. Необходимость
постоянного контроля за способом передачи объектов со стороны разработчика уже сама по себе выглядит достаточно раздражающей; к тому же она чревата многочисленными ошибками и затрудняет отладку и сопровождение готовых скриптов.
Однако, куда более существенным оказалось другое отрицательное последствие данного недостатка - технические препятствия для дальнейшего развития существующей объектной модели [6]. В рамках четвертой версии
создать более или менее полноценную модель так и не удалось.
PHP 5
На этот раз, вместе с новым движком, была полностью переписана и объектная модель. И, конечно же, устранен ее главный недостаток - передача объектов по значению больше не характерна для поведения модели по умолчанию.
Достичь такого результата позволило решение ввести специальные указатели
(handlers) на объекты [4]. К этим указателям мы еще вернемся (Глава 4, Основное отличие объектной модели PHP 5); а пока заметим только, что аналогичные указатели используются в PHP
и для ресурсов.
Тем самым был расчищен путь для обогащения объектной модели, чем разработчики и не преминули воспользоваться. Ниже приведен краткий список новых объектно-ориентированных особенностей языка в пятой версии [8][5].
Основные новые объектно-ориентированные особенности PHP
5
Единый конструктор и деструктор.
Модификаторы доступа.
Конечные классы и методы.
Абстрактные классы и методы.
Интерфейсы.
Константы класса.
Статические свойства и методы.
Магические методы.
Клонирование объектов.
Встроенные классы и интерфейсы.
Таким образом, хоть и с заметным опозданием[1],
PHP стал относительно полноценным объектно-ориентированным языком. По-видимому, эта задержка объясняется тем, что PHP значительно больше, чем другие языки, сконцентрирован на разработке веб приложений, а серьезный спрос на объектно-ориентированные решения в этой сфере сформировался только в последние годы [5].
PHP 6
Во время встречи ведущих разработчиков PHP в Париже в ноябре 2005 года были намечены основные особенности следующей, шестой, версии; в том числе, и изменения в объектной модели [7].
Изменения объектно-ориентированной функциональности в PHP 6
Возможность предусмотреть обязательность вызова конструктора родительского класса из конструктора класса-наследника.
Разрешение объявлять конструктор в интерфейсах.
Применение подсказки типа при наследовании.
Наличие позднего статического связывания.
Поддержка пространства имен.
Возможность использовать подсказку типа для возвращаемой величины.
Запрет статического вызова динамических функций и динамического
вызова статических членов класса.
Кеширование при использовании рефлексии.
Контрольные вопросы и задания
Подсказка
Вспомнить, что такое передача данных по значению и по ссылке поможет секция "Передача аргументов" в статье "Функции", опубликованной ранее в рамках рассылки "PHP 5 для начинающих".
Создайте собственный скрипт на основе приведенного кода (Пример 3.1, «Передача массива в функцию») и исполните его на локальном или удаленном сервере. Постарайтесь объяснить полученный результат.