File tree Expand file tree Collapse file tree 2 files changed +7
-1
lines changed Expand file tree Collapse file tree 2 files changed +7
-1
lines changed Original file line number Diff line number Diff line change @@ -88,6 +88,8 @@ struct _zend_class_entry {
8888 } info;
8989}
9090```
91+ > create_object为实例化对象的操作,可以通过扩展自定义这个函数
92+
9193举个例子具体看下,定义一个User类,它继承了Human类,User类中有一个常量、一个静态属性、两个普通属性:
9294``` php
9395//父类
Original file line number Diff line number Diff line change @@ -10,7 +10,7 @@ struct _zend_object {
1010 zend_refcounted_h gc; //引用计数
1111 uint32_t handle;
1212 zend_class_entry *ce; //所属类
13- const zend_object_handlers *handlers; //对象的一些操作接口
13+ const zend_object_handlers *handlers; //对象操作处理函数
1414 HashTable *properties;
1515 zval properties_table[1]; //普通属性值数组
1616};
@@ -67,6 +67,10 @@ ZEND_API zend_object_handlers std_object_handlers = {
6767 NULL, /* compare */
6868}
6969```
70+ > __ Note:__ 这些handler用于操作对象(如:设置、读取属性),std_object_handlers是PHP定义的默认、标准的处理函数,在扩展中可以自定义handler,比如:重定义write_property,这样设置一个对象的属性时将调用扩展自己定义的处理函数,让扩展拥有了更高的控制权限。
71+ >
72+ > 需要注意的是:const zend_object_handlers * handlers,这里的handlers指针加了const修饰符,const修饰的是handlers** 指向的对象** ,而不是handlers指针本身,所以扩展中可以将一个对象的handlers修改为另一个zend_object_handlers指针,但无法修改zend_object_handlers中的值,比如:` obj->handlers->write_property = xxx ` 将报错,而:` obj->handlers = xxx ` 则是可以的。
73+
7074__ (4)properties:__ 普通成员属性哈希表,对象创建之初这个值为NULL,主要是在动态定义属性时会用到,与properties_table有一定关系,下一节我们将单独说明,这里暂时忽略。
7175
7276__ (5)properties_table:__ 成员属性数组,还记得我们在介绍类一节时提过非静态属性存储在对象结构中吗?就是这个properties_table!注意,它是一个数组,` zend_object ` 是个变长结构体,分配时会根据非静态属性的数量确定其大小。
You can’t perform that action at this time.
0 commit comments