首页 > 软件下载 > 编程开发

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

2022-06-12

资源介绍

在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结构体中:

    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);

展开全部

版权声明

1 本站所有资源(含游戏)均是软件作者、开发商投稿,任何涉及商业盈利目的均不得使用,否则产生的一切后果将由您自己承担!

2 本站资源下载后不得用于商业用途,所有资源请在下载后24小时内删除。

3 若有关在线投稿、无法下载等问题,请与本站客服人员联系。

4 如侵犯了您的版权、商标等,请立刻联系我们并具体说明情况后,本站将尽快处理删除,联系QQ:2499894784

最近更新

热门排行

最需网客户端 软件问题一手掌握

去 App Store 免费下载 iOS 客户端