Расширения PHP и PHP построены на основе Zend Engine. Они предоставляют функциональность Zend Engine для пользователей (скрипты PHP) и добавляют свои собственные функции, которые либо подвергаются действию пользователя, либо другим расширениям PHP.
Zend Engine предоставляет объектную модель с возможностью доступа к размерам объекта (функциональность, открытая ArrayAccess
) и общий механизм итерации, используемый для итерации по объектам (idem для Iterator
). Эта объектная модель состоит из нескольких обработчиков, которые PHP и любое расширение могут заменить для типа объекта (zend object handlers). По своей объектной модели движок Zend реализует стандартный тип объектов («объекты zend»); каждый объект следует за структурой данных zend_object
, и каждый класс - это концепция, которую интерфейс объектов низкого уровня не знает, помимо предоставления способа его получения, - структурой zend_class_entry
).
ArrayAccess
на самом деле не интерфейс SPL; он определен в самом Zend Engine. read_dimension
/write_dimension
/ низкоуровневые обработчики объектов zend реализованы таким образом, что они проверяют, реализует ли объект такой интерфейс и вызывает соответствующие методы, если это так (см. here).
Iterator
также не является интерфейсом SPL; он также определен в Zend Engine. В этом случае поддержка этого интерфейса выполняется на несколько более высоком уровне. Обработчики объектов низкого уровня ничего не знают об итерации объектов; это свойство объектов Zend. Структура zend_class_entry
имеет два соответствующих члена: поле iterator_funcs
и поле get_iterator
. Они определяют операции и состояние итератора и как создать новый итератор. Для Iterator
, в частности, когда класс зарегистрирован во время выполнения, он проверяет, реализует ли он этот интерфейс, и если это так, соответствующие поля в переменной zend_class_entry
для этого класса устанавливаются в собственные методы, которые соединяют собственный интерфейс итерации с PHP методы. Если вы пишете PHP-расширение, можно выбрать либо написание собственного итератора (который реализует методы итерации изначально), либо, как и в пользовательской области, реализовать Iterator
и написать PHP-методы (в данном случае собственные PHP-методы) для несколько операций, как описывает интерфейс.
Интерфейс Countable
- это единственный интерфейс на основе SPL; Zend Engine ничего об этом не знает. Его функциональность проистекает из того факта, что реализация count
function проверяет его наличие и вызывает метод count
, если интерфейс существует.
Расширение оператора работает с более низким уровнем настройки.Во время выполнения непосредственно записывает в память Zend Engine и заменяет обработчики кодов кода PHP, которые компилируются (так что теперь, например, у ZEND_ASSIGN_ADD
есть новая собственная реализация, которая отбрасывает некоторые функции и методы PHP, которые пользователь может выбрать) ,
Это не отвечает на ваш вопрос. Но поскольку вы спрашиваете о внутренних компонентах, вы попадете сюда: http://svn.php.net/repository/php/php-src/branches/PHP_5_3/Zend/ - чтобы вы могли также посмотреть на zend_interfaces. c и ../ext/spl/ сейчас. – mario