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

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


546 Глава 22 Расширение РНР: часть II

struct _zend_function_entry *builtin_functions;

union _zend_function *constructor; union _zend_function *destructor; union _zend_function *clone;

union _zend_function *_get;

union _zend_function *_set;

union _zend_function *_call;

zend_class_iterator_funcs iterator_funcs;

/* обработчики */

zend_object_value (*create_object)(zend_class_entry *class_type TSRMLS_DC);

zend_object_iterator *(*get_iterator)

(zend_class_entry *ce, zval *object TSRMLS_DC); int (*interface_gets_implemented)

(zend_class_entry *iface, zend_class_entry *class_type

TSRMLS_DC);

zend_class_entry **interfaces; zend_uint num_interfaces;

char *filename;

zend_uint line_start;

zend_uint line_end;

char *doc_comment;

zend uint doc comment len;

};

Очевидно, код довольно большой. К счастью, существуют макросы, облегчающие работу с большинством элементов. Необходимо отметить ряд моментов.

 Структура содержит хеш-таблицы для всех методов, констант, статических переменных и стандартных значений свойств.

 Несмотря на то что структура имеет частную хеш-таблицу для методов, она содержит отдельные zend_function-блоки для конструктора, деструктора, метода клонирования и обработчиков переопределения.

Создание нового класса

Чтобы создать пустой класс, как, например, следующий: class Empty {}

необходимо всего несколько операций. Во-первых, в главной области действия расширения объявляется указатель zend_class_entry, в котором будет регистрироваться класс:

static zend_class_entry *empty_ce_ptr;

Затем в MINIT-обработчике используется макрос INIT_CLASS_ENTRY () для инициализации класса и функция zend_register_internal_class (), завершающая регистрацию.




  Hostland.Ru

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