PHP扩展开发之对象处理器(Object Handlers)
Object Handlers
在前面的博文中,已经介绍过一些 object handlers 了,也特别介绍了如何通过指定 handlers 来创建一个自定义的结构和使用clone_obj来对自定义的结构进行克隆操作。
然而,这只是开始:在 php 中,几乎所有的对象操作,都可以通过 object handlers 来实现,而且所有的魔术方法和魔术接口在内核中都是实现了对应的 object handler。此外,
一些 handlers 并没有开放给用户端的 php,例如,内部类可以自定义类的比较操作,而使用 php 代码是无法实现的。
由于 php 中有很多不同的 object handlers,这里只挑几个来讨论,其它的只给出简单的说明。
概述
下面列举出 php 中主要的 26 个(php5.6 中为 28 个)object handlers(位于 phpsrc/Zend/zend_object_handlers.h),并给出简要的说明。
zval *read_property(zval *object, zval *member, int type, const struct _zend_literal *key TSRMLS_DC)
void write_property(zval *object, zval *member, zval *value, const struct _zend_literal *key TSRMLS_DC)
int has_property(zval *object, zval *member, int has_set_exists, const struct _zend_literal *key TSRMLS_DC)
void unset_property(zval *object, zval *member, const struct _zend_literal *key TSRMLS_DC)
zval **get_property_ptr_ptr(zval *object, zval *member, const struct _zend_literal *key TSRMLS_DC)上述 handlers 分别表示__get,__set,__isset,__unset方法。get_property_ptr_ptr等同于__get返回一个引用类型。zend_literal *key作为这些函数的参数
起到优化作用,例如它包含了一些将属性名进行 hash 计算的结果。

