2011-01-01 2 views
5

Я читал о часто используемых интерфейсах PHP из SPL, таких как Iterator, Countable и ArrayAccess. Однако я не понимаю, как они работают.Как работает ArrayAccess?

Выполняют ли их реализации основные функциональные возможности PHP, например, перегружают оператор массива []?

Я также читал об расширении оператора, что обеспечивает возможность перегрузки других операторов таким же образом, как языки нижнего уровня. Поскольку расширение Operator явно модифицирует ядро ​​PHP, мне было интересно, как ArrayAccess действует так же за кулисами?

Я возитель, поэтому мне трудно использовать что-то, не зная, что находится под капотом.

+0

Это не отвечает на ваш вопрос. Но поскольку вы спрашиваете о внутренних компонентах, вы попадете сюда: http://svn.php.net/repository/php/php-src/branches/PHP_5_3/Zend/ - чтобы вы могли также посмотреть на zend_interfaces. c и ../ext/spl/ сейчас. – mario

ответ

10

Расширения 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, которые пользователь может выбрать) ,

+0

Ничего себе, спасибо ** Artefacto ** за этот всеобъемлющий ответ, он наверняка заполнил пробелы в моем понимании. Мне определенно нужно многому научиться. – Dan