php对象底层实现
PHP 对象的底层实现
PHP 对象的底层实现主要依赖于 Zend 引擎,具体通过 zend_object 结构体和相关机制管理。以下是关键实现细节:
对象存储结构
PHP 对象在底层通过 zend_object 结构体表示,包含以下核心成员:
zend_refcounted_h:引用计数头部,用于垃圾回收。handlers:指向对象操作函数表的指针(如属性访问、方法调用等)。properties:动态属性的哈希表(非静态属性)。ce:指向类入口(zend_class_entry)的指针,描述类信息。
struct _zend_object {
zend_refcounted_h gc;
uint32_t handle;
zend_class_entry *ce;
const zend_object_handlers *handlers;
HashTable *properties;
zval properties_table[1]; // 动态属性存储
};
类信息存储
类定义通过 zend_class_entry 结构体描述:
name:类名。properties_info:静态属性哈希表。function_table:方法哈希表(存储zend_function结构体)。parent:父类指针。constants_table:类常量哈希表。
struct _zend_class_entry {
char type;
zend_string *name;
HashTable function_table;
HashTable properties_info;
zend_class_entry *parent;
// 其他成员省略...
};
对象创建流程
- 内存分配:调用
ecalloc分配zend_object内存,空间包括对象头和属性表。 - 初始化引用计数:设置
gc.refcount为 1,gc.u.type_info标识对象类型。 - 绑定类入口:将
ce指向对应的zend_class_entry。 - 设置操作句柄:根据类类型(普通类、内部类等)选择
handlers。
属性访问机制
- 静态属性:存储在
zend_class_entry.properties_info中,通过类直接访问。 - 动态属性:通过
zend_object.properties哈希表管理,键为属性名,值为zval。 - 访问流程:调用
handlers->read_property或write_property钩子函数。
方法调用流程
- 从
zend_class_entry.function_table查找方法(zend_function)。 - 若未找到,检查父类链(
parent指针)。 - 通过
zend_execute_internal或zend_execute_ex执行方法体。
垃圾回收
- 引用计数(
gc.refcount)归零时触发回收。 - 循环引用通过垃圾收集器(GC)标记清除算法处理。
性能优化点
- 对象缓存:复用频繁创建的对象(如 Flyweight 模式)。
- 属性预分配:减少动态属性哈希表扩容开销。
- 避免魔术方法:
__get/__set会显著降低访问速度。







