Реклама в журнале

Zend 2.0. Что нового?

Источник: http://wa.artel.by/

Михаил Дубаков
firefalcon@tut.by

В скором времени движок Zend 2 будет составлять ядро PHP. Неплохо бы уже сейчас знать, чем новое ядро отличается от старого. В основном меня интересуют изменения в Объектной модели, так что в цикле переводов ей будет уделено особое внимание.

Исправление объектной модели

Предпосылки

В Zend 1.0 (который является ядром PHP) объектная модель была спроектирована так, что создаваемые объекты были переменными языка. Это значит, что когда программисты производили операции, например, объявление переменной и передачу параметра функции, объекты обрабатывались практически так же, как простые типы integer или string. Семантически это означает, что целый объект копируется. В Java совсем другой подход, когда ссылаться на объект можно по указателю, а не по переменной (можно рассматривать указатель как ID объекта).

Необходимость

К сожалению, существующий подход в Zend Engine 1.0 вызывает ограничения в объектной модели. Главная проблемы в том, что очень сложно контролировать создание и дублирование объектов. Это ведет к неэффективной разработке и иногда вызывает странное поведение программы при запуске. Изменение объектной модели на указатель-ориентированную позволит ввести такие полезные вещи, как деструкторы, полный контроль над дублированием объектов и т.п.

Обзор

Предлагаемая объектная модель взяла многое из модели в Java. В общем, когда вы создаете новый объект, вы получаете указатель на объект, а не сам объект. Когда этот указатель посылается функции, объявляется или копируется, это всего лишь указатель, который посылается/объявляется/копируется. Сам объект никогда не копируется и не дублируется. В результате получается, что все указатели объекта ссылаются на один и тот же объект. Это устраняет ненужное дублирование объектов и их странное поведение.

Функциональность

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

$object = new MyClass();
$object->method();

В этом коде переменная $object является указателем на экземпляр объекта класса MyClass и вызывается один из методов данного класса.

Рассмотрим следующий код:

1 class MyClass
2 {
3 function setMember($value)
4 {
5 $this->member = $value;
6 }
7
8 function getMember()
9 {
10 return $this->member;
11 }
12 }
13
14 function foo($obj)
15 {
16 $obj->setMember("foo");
17 }
18
19 $object = new MyClass();
20 $object->setMember("bar");
21 foo($object);
22 print $object->getMember();

Без Java-подобных указателей в строке 20 свойство member объекта MyClass принимает строковое значение "bar". Из-за внутреннего представления объектов в Zend 1.0, объект помечается как ссылка и когда он посылается как переменная в функцию foo, он дублируется (!). Поэтому вызов функции foo() в строке 21, которая вызывает $obj->setMember("foo"), будет выполняться для дубликата $object. В строке 22 будет выведено "bar", хотя по идее должно выводится "foo".

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

Новая объектная модель позволяет писать более интуитивный код. В строке 21 в функцию foo() будет передаваться указатель (ID) объекта. В самой функции по указателю будет вызываться сам объект, а не его копия. Поэтому в строке 22 будет выведено "foo", что и ожидается. Такой подход позволяет разработчику контролировать, когда объект создается и когда дублируется. Кроме того, из-за отсутствия такого дублирования увеличится производительность скрипта.

Это лишь краткое описание того, почему новая объектная модель устраняет нелогичное поведение и делает манипуляции с объектами более простыми, интуитивными и эффективными. Важность этих изменений будет понятна позже, потому что они служат базисом для новых свойств.




Играйте и выигрывайте! Интернет лотерея iLoto.net
Реклама в журнале

Copyright © <LMTH>. Все материалы являются собственностью их авторов.
При перепечатывании ссылка на http://www.magaz.org/ как на источник
информации обязательна. Правила использования материалов журнала