PHP100教程之深入理解PHP内核类的结构


PHP100教程之深入理解PHP内核类的结构

文章插图
PHP100教程之深入理解PHP内核类的结构

文章插图

在php中类的定义以class关键字开始,后面接类名,类名可以是任何非PHP保留字的名字 。在类名后面紧跟着一对花括号,类的成员函数和成员变量定义在这里 。类是一种复合型的结构,其需要存储较多元化的数据,如属性,方法,以及自身的一些性质 。如下一段PHP代码:
class ParentClass {
}

interface Ifce {
public function iMethod();
}

final class Tipi extends ParentClass implements Ifce{
public static= aaa;
const CA = bbb;

public function __constrct() {
}

public function iMethod() {
}

PRivate function _access() {
}

public static function access() {
}
}这展现了PHP中面向对象编程中的接口,继承,静态成员变量,静态方法,常量,访问控制等内容 。这些也许已经比较熟悉了,那么这些结构在Zend引擎内部是如何实现的?类的这些方法、成员变量是如何存储的?这些访问控制,静态成员是如何标记的?
我们在PHP的源码中很容易找到类的结构存放在zend_class_entry结构体中:
【PHP100教程之深入理解PHP内核类的结构】struct _zend_class_entry {
char type;// 类型:ZEND_INTERNAL_CLASS / ZEND_USER_CLASS
char *name;// 类名称
zend_uint name_length;// 即sizeof(name) - 1
struct_zend_class_entry *parent; // 继承的父类
intrefcount;// 引用数
zend_bool constants_updated;

zend_uint ce_flags; // ZEND_ACC_IMPLICIT_ABSTRACT_CLASS: 类存在abstract方法
// ZEND_ACC_EXPLICIT_ABSTRACT_CLASS: 在类名称前加了abstract关键字
// ZEND_ACC_FINAL_CLASS
// ZEND_ACC_INTERFACE
HashTable function_table;// 方法
HashTable default_properties;// 默认属性
HashTable properties_info;// 属性信息
HashTable default_static_members;// 静态变量
HashTable *static_members; // type == ZEND_USER_CLASS时,取&default_static_members;
// type == ZEND_INTERAL_CLASS时,设为NULL
HashTable constants_table;// 常量
struct _zend_function_entry *builtin_functions;// 方法定义入口


union _zend_function *constructor;
union _zend_function *destructor;
union _zend_function *clone;


/* 魔术方法 */
union _zend_function *__get;
union _zend_function *__set;
union _zend_function *__unset;
union _zend_function *__isset;
union _zend_function *__call;
union _zend_function *__tostring;
union _zend_function *serialize_func;
union _zend_function *unserialize_func;
zend_class_iterator_funcs iterator_funcs;// 迭代

/* 类句柄 */
zend_object_value (*create_object)(zend_class_entry *class_type TSRMLS_DC);
zend_object_iterator *(*get_iterator)(zend_class_entry *ce, zval *object,
intby_ref TSRMLS_DC);

/* 类声明的接口 */
int(*interface_gets_implemented)(zend_class_entry *iface,
zend_class_entry *class_type TSRMLS_DC);


以上就是PHP100教程之深入理解PHP内核类的结构,希望大家喜欢,请继续关注我们 。

    推荐阅读