|
|
|
Новое в PHP5
XML и веб-сервисы
Безопасный офис
Защита от копирования и методы ее взлома
История PHP
Корпоративная информационная система
Новое в PHP5
Основные типы данных PHP
Основы языка программирования РНР 5
Программистские байки
Торговая информационная система
|
Новая объектно-ориентированная модель
Новые объектно-ориентированные особенности
Новый диспетчер памяти
Отказ от поддержки Windows 95
Прочие нововведения в язык программирования PHP5
Когда Зив Сураски (Zeev Suraski) добавил объектно-ориентированный синтаксис в РНР 3, это был лишь «синтаксический подсластитель, облегчающий работу со структурами данных». На тот момент объектно-ориентированная модель поддерживала механизм наследования и позволяла классу (объекту) объединять методы и свойства, но не более того. Позднее, создавая РНР 4, Зив Сураски и Энди Гутмане полностью переписали ядро интерпретатора. Это было совершенно новое ядро, оно работало намного быстрее, стало стабильнее и обладало более широким набором возможностей. Однако реализация объектно-ориентированной модели осталась практически нетронутой. Однако несмотря на серьезные ограничения парадигма объектно-ориентированного программирования широко применялась при разработке новых, порой весьма объемных, программ на РНР 4. Такое положение дел привело к тому, что при разработке РНР версии 5 основное внимание было сконцентрировано на реализации объектно-ориентированных возможностей языка. Какие же основные ограничения имелись в РНР 3 и 4? Самая большая проблема (из которой проистекало большинство других) состояла в том, что семантика операции копирования применительно к объектам несла ту же смысловую нагрузку, что и для обычных типов. То есть когда значение указателя на объект присваивалось другой переменной, создавалась полная копия объекта. Это не только снижало производительность программ, но и становилось источником огромного количества ошибоку, поскольку многие разработчики после выполнения присваивания интуитивно продолжали считать, что обе переменные ссылаются на один и тот же экземпляр класса, хотя на самом деле это было далеко не так. Переменные представляли разные копии объекта, а не ссылки на один и тот же объект. Изменение в одной из них не оказывало никакого влияния на другую. Например: class Person { var $name; function getNameO { return $this->name; } function setName($name) { $this->name = $name; function Person($name) { $this->setName($nanfie); } } function changeName($person, $name) { $person->setName($narce); > $person = new Person("Andy"); changeName($person, "Stig"); Print $person->getName(); В РНР 4 этот участок кода выведет "Andy". Причина в том, что объект Sperson передается в функцию changeName() по значению, то есть в момент вызова функции создается полная копия объекта $person и функция работает с копией объекта, а не с самим объектом.
Такое поведение интерпретатора не соответствует ожиданиям разработчиков, привыкших работать с Java-подобной объектной моделью, в которой переменные фактически хранят ссылки (или указатели) на объекты. В результате при копировании таких переменных создаются новые копии ссылок на объекты, а не сами объекты. Программисты, работающие с РНР 4, делятся на два типа - на тех, кто знает об этой неприятности, и тех, кто о ней даже не подозревает. Дело в том, что последние обычно пишут такой код, где она действительно никак не проявляется. Разумеется, рано или поздно некоторые из них сталкиваются с ней и ночей не спят, пытаясь выловить «странные», не встречавшиеся ранее ошибки. Первые же, зная об этой проблеме, всегда передают объекты по ссылке, но читать их код весьма нелегко из-за обилия символов «&». Прежняя реализация объектной модели не только была источником упомянутых выше проблем, но и препятствовала реализации новых возможностей поверх существующей модели. В результате вся инфраструктура объектной модели в РНР 5 была полностью переписана так, чтобы все действия производились со ссылками на объекты. Теперь полная копия объекта может создаваться только с помощью явного указания ключевого слова clone (иначе создать полную копию объекта в РНР 5 просто невозможно) и программист уже не должен постоянно помнить о ссылках на объекты при копировании - все это делается автоматически. Примечание По-прежнему допускается передача объектов по ссылке, их копирование и модификация с применением устаревшего синтаксиса.
|
|
|
|