PHP100教程之深入理解PHP內(nèi)核類的結(jié)構(gòu)

2022-06-12發(fā)布者:ylm大?。?/span> 下載:0

文件大小:

軟件介紹

在php中類的定義以class關(guān)鍵字開(kāi)始,后面接類名,類名可以是任何非PHP保留字的名字。在類名后面緊跟著一對(duì)花括號(hào),類的成員函數(shù)和成員變量定義在這里。類是一種復(fù)合型的結(jié)構(gòu),其需要存儲(chǔ)較多元化的數(shù)據(jù),如屬性,方法,以及自身的一些性質(zhì)。如下一段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() {
        }
}這展現(xiàn)了PHP中面向?qū)ο缶幊讨械慕涌?,繼承,靜態(tài)成員變量,靜態(tài)方法,常量,訪問(wèn)控制等內(nèi)容。這些也許已經(jīng)比較熟悉了,那么這些結(jié)構(gòu)在Zend引擎內(nèi)部是如何實(shí)現(xiàn)的?類的這些方法、成員變量是如何存儲(chǔ)的?這些訪問(wèn)控制,靜態(tài)成員是如何標(biāo)記的?

我們?cè)赑HP的源碼中很容易找到類的結(jié)構(gòu)存放在zend_class_entry結(jié)構(gòu)體中:

    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;  // 引用數(shù)
        zend_bool constants_updated;
 
        zend_uint ce_flags; // ZEND_ACC_IMPLICIT_ABSTRACT_CLASS: 類存在abstract方法
        // ZEND_ACC_EXPLICIT_ABSTRACT_CLASS: 在類名稱前加了abstract關(guān)鍵字
        // ZEND_ACC_FINAL_CLASS
        // ZEND_ACC_INTERFACE
        HashTable function_table;      // 方法
        HashTable default_properties;          // 默認(rèn)屬性
        HashTable properties_info;     // 屬性信息
        HashTable default_static_members;// 靜態(tài)變量
        HashTable *static_members; // type == ZEND_USER_CLASS時(shí),取&default_static_members;
        // type == ZEND_INTERAL_CLASS時(shí),設(shè)為NULL
        HashTable constants_table;     // 常量
        struct _zend_function_entry *builtin_functions;// 方法定義入口
 
 
        union _zend_function *constructor;
        union _zend_function *destructor;
        union _zend_function *clone;
 
 
        /* 魔術(shù)方法 */
        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);

發(fā)表評(píng)論(共0條評(píng)論)
請(qǐng)自覺(jué)遵守互聯(lián)網(wǎng)相關(guān)政策法規(guī),評(píng)論內(nèi)容只代表網(wǎng)友觀點(diǎn),發(fā)表審核后顯示!

版權(quán)聲明:

1 本站所有資源(含游戲)均是軟件作者、開(kāi)發(fā)商投稿,任何涉及商業(yè)盈利目的均不得使用,否則產(chǎn)生的一切后果將由您自己承擔(dān)!

2 本站將不對(duì)任何資源負(fù)法律責(zé)任,所有資源請(qǐng)?jiān)谙螺d后24小時(shí)內(nèi)刪除。

3 若有關(guān)在線投稿、無(wú)法下載等問(wèn)題,請(qǐng)與本站客服人員聯(lián)系。

4 如侵犯了您的版權(quán)、商標(biāo)等,請(qǐng)立刻聯(lián)系我們并具體說(shuō)明情況后,本站將盡快處理刪除,聯(lián)系QQ:2499894784

返回頂部