Skip to content

Commit fdc34c3

Browse files
committed
update class
1 parent be427c2 commit fdc34c3

File tree

2 files changed

+7
-1
lines changed

2 files changed

+7
-1
lines changed

3/zend_class.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff 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
//父类

3/zend_object.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff 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`是个变长结构体,分配时会根据非静态属性的数量确定其大小。

0 commit comments

Comments
 (0)