Отправляет email-рассылки с помощью сервиса Sendsay

PHP 5 для начинающих

  Все выпуски  

ООП и PHP


Вниманию читателей!

Отдельные выпуски рассылки в той или иной мере взаимосвязаны. С предыдущими выпусками Вы можете ознакомиться:

  1. в архиве рассылки (оригиналы выпусков);
  2. на сайте рассылки (исправленные и дополненные версии).

# # #

Вы также можете подписаться на рассылку "PHP 5: Новые возможности".

PHP 5 для начинающих

Предлагаемый материал последовательно освещает основные этапы эволюции объектно-ориентированных особенностей PHP.

Любопытно, что изначально PHP вовсе не задумывался как объектно-ориентированный язык. Еще летом 1997 года у его создателей не было планов по включению в PHP каких-либо объектно-ориентированных возможностей. [4]

Ситуация изменилась 27 августа 1997 года, когда в разрабатываемую версию был включен объектно-ориентированный синтаксис для доступа к ассоциативным массивам. А для широкой общественности первые элементы поддержки ООП стали доступны с выходом в середине 1998 года третьей версии PHP. К тому времени первоначальная идея обросла дополнительными деталями, но все же существующая поддержка ООП не обеспечивала чего-то намного более существенного, чем еще один способ доступа к массивам. Объекты были, по сути, контейнерами для свойств, то есть, мало чем отличались от ассоциативных массивов. [4][5]

Впрочем, главное отличие, конечно, заключалось в том, что объекты являлись экземплярами классов, а те, в свою очередь, были контейнерами не только для свойств, но и для методов. Объекты можно было создавать при помощи оператора new. Поддерживался даже механизм наследования, что позволяло создавать более специализированные классы без того, чтобы разрабатывать их с нуля или копировать код родительского класса. [4]

Объектная модель, несмотря на ее явную ограниченность и появление нового движка, в четвертой версии не претерпела существенных изменений. Возможно, это случилось из-за выраженного стремления создателей обеспечить обратную совместимость с предыдущей версией [6]. Впрочем, в PHP 4 была добавлена возможность вызывать методы класса как из контекста соответствующего объекта, так и извне его. [4]

Однако, объектная модель в PHP 3 и 4 имела весьма существенный недостаток, что значительно усложняло и ограничивало возможности ее применения. Коротко этот недостаток можно сформулировать следующим образом: передача объектов осуществлялась не по ссылке, а по значению. Вскоре мы рассмотрим подробнее, что это значит, и почему это так важно (Глава 4, Основное отличие объектной модели PHP 5).

Указанный недостаток отчасти можно обойти, задавая способ передачи явным образом путем использования символа &. К сожалению, это не является полноценным решением. Необходимость постоянного контроля за способом передачи объектов со стороны разработчика уже сама по себе выглядит достаточно раздражающей; к тому же она чревата многочисленными ошибками и затрудняет отладку и сопровождение готовых скриптов.

Однако, куда более существенным оказалось другое отрицательное последствие данного недостатка - технические препятствия для дальнейшего развития существующей объектной модели [6]. В рамках четвертой версии создать более или менее полноценную модель так и не удалось.

На этот раз, вместе с новым движком, была полностью переписана и объектная модель. И, конечно же, устранен ее главный недостаток - передача объектов по значению больше не характерна для поведения модели по умолчанию.

Достичь такого результата позволило решение ввести специальные указатели (handlers) на объекты [4]. К этим указателям мы еще вернемся (Глава 4, Основное отличие объектной модели PHP 5); а пока заметим только, что аналогичные указатели используются в PHP и для ресурсов.

Тем самым был расчищен путь для обогащения объектной модели, чем разработчики и не преминули воспользоваться. Ниже приведен краткий список новых объектно-ориентированных особенностей языка в пятой версии [8][5].

Основные новые объектно-ориентированные особенности PHP 5

  1. Единый конструктор и деструктор.

  2. Модификаторы доступа.

  3. Конечные классы и методы.

  4. Абстрактные классы и методы.

  5. Интерфейсы.

  6. Константы класса.

  7. Статические свойства и методы.

  8. Магические методы.

  9. Клонирование объектов.

  10. Встроенные классы и интерфейсы.

Таким образом, хоть и с заметным опозданием[1], PHP стал относительно полноценным объектно-ориентированным языком. По-видимому, эта задержка объясняется тем, что PHP значительно больше, чем другие языки, сконцентрирован на разработке веб приложений, а серьезный спрос на объектно-ориентированные решения в этой сфере сформировался только в последние годы [5].

Во время встречи ведущих разработчиков PHP в Париже в ноябре 2005 года были намечены основные особенности следующей, шестой, версии; в том числе, и изменения в объектной модели [7].

Изменения объектно-ориентированной функциональности в PHP 6

  1. Возможность предусмотреть обязательность вызова конструктора родительского класса из конструктора класса-наследника.

  2. Разрешение объявлять конструктор в интерфейсах.

  3. Применение подсказки типа при наследовании.

  4. Наличие позднего статического связывания.

  5. Поддержка пространства имен.

  6. Возможность использовать подсказку типа для возвращаемой величины.

  7. Запрет статического вызова динамических функций и динамического вызова статических членов класса.

  8. Кеширование при использовании рефлексии.

[Подсказка]Подсказка

Вспомнить, что такое передача данных по значению и по ссылке поможет секция "Передача аргументов" в статье "Функции", опубликованной ранее в рамках рассылки "PHP 5 для начинающих".

  1. Внимательно изучите следующий скрипт (Пример 3.1, «Передача массива в функцию») и попытайтесь ответить, какой вывод будет им сгенерирован.


  2. Создайте собственный скрипт на основе приведенного кода (Пример 3.1, «Передача массива в функцию») и исполните его на локальном или удаленном сервере. Постарайтесь объяснить полученный результат.

  3. Предложите способ получения ожидаемого результата при вызове функции unsetFirstElement() (Пример 3.1, «Передача массива в функцию»).

«Ответы и решения к Глава 3, ООП и PHP»



[1] Другие языки, например, Java, вышли на полноценный уровень объектной модели еще лет десять назад.

Created with DocBook


В избранное