Профессиональное программирование на PHP

Страница 471 из 591


Классы 489

zend_object_unset_dimension_t unset_dimension;

zend_obj ect_get_properties_t get_properties;

zend_object_get_method_t get_method;

zend_object_ call method t call method;

zend_object_get_constructor_t get_construetor;

zend_object_get_class_entry_t get_class_entry;

zend_obj ect_get_class_name_t get_class_name;

zend_obj ect_compare_t compare_obj ects;

zend_object_cast_t cast_object;

} zend_object_handlers;

Более подробно все эти обработчики рассматриваются в главе 22, "Расширение РНР: часть П", в которой описана реализация классов расширений. Здесь достаточно знать, что имена обработчиков сравнительно четко указывают на выполняемые обработчиками действия. Например, add_ref всегда вызывается при добавлении ссылки на объект:

$object2 = $object;

a compare_ob j ects всегда вызывается при сравнении двух объектов с помощью оператора равенства:

if($object2 == $object) {}

Создание объектов

Во второй версии Zend Engine создание объекта происходит в два этапа. Когда выполняется код

$object = new ClassName;

новый объект zend_object создается и помещается в память для объектов, а в переменную $object записывается указатель на объект. По умолчанию (например, когда создается экземпляр пользовательского класса) объект размещается с помощью стандартного распределителя, и для него назначаются стандартные обработчики доступа. Иначе, если в записи zend_class_entry класса имеется определение функции create_object, функция вызывается для размещения объекта и возвращает массив обработчиков zend_ob j ect_handler объекта.

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

Только после того как структура zend_obj ect_value создана, вызывается конструктор объекта. Даже в расширениях конструктор (а также деструктор и метод clone) представляют собой "обычные" функции zend_function. Они не изменяют уже установленные обработчики доступа к объекту.

Другие важные структуры

В дополнение к таблицам функций и классов существует несколько других глобальных структур данных, заслуживающих внимания. Знание принципов их работы не является особенно важным для использования РНР, но может оказаться полезным, если по-




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006