對象的“本”

我們需要跟深入地瞭解這種機制,看對象的“本”。對象是什麼?對象在PHP中也是變量的一種,所以先看PHP源碼中對變量的定義:

#zend/zend.h
typedef union_zvalue_value{
    long lval;/* long value */
    double dval;/* double value */
    struct{
        char *val;
        int len;
    } str;
    HashTable *ht; /*hash table value*/
    zend_object_value obj;
} zvalue_value;

zvalue_value,就是PHP底層的變量類型,zend_object_value obj 就是變量中的一個結構。接着看對象的底層實現。

在PHP5中,對象在底層的實現是採用“屬性數組+方法數組”來實現的。可以簡單地理解爲PHP對象在底層的存儲如圖所示


對象在PHP中是使用一種zend_object_value結構體來存儲的。對象在ZEND(PHP底層引擎,類似Java的JVM)中的定義如下:

#zend/zend.h
typedef struct _zend_object {
    zend_class_entry * ce; //這就是類入口
    HashTable *properties; //屬性組成的HashTable
    HashTable *guards; /*protects form __get/__set ...recursion*/
} zend_object;

ce是存儲該對象的類結構,在對象初始化時保存了類的入口,相當於類指針的作用。prop-erties是一個HashTable,用來存放對象屬性。guards用來阻止遞歸調用。

類的標準方法在zend/zend_object_handlers.h 文件中定義,具體實現則是在zend/zend_object_handlers.c文件中。關於PHP變量的存儲結構的底層實現,以後在深入的介紹。

通過對上述源代碼的簡單閱讀,可以更清晰地認識到對象也是一種很普通的變量,不同的是其懈怠了對象的屬性和類的入口。

發佈了58 篇原創文章 · 獲贊 54 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章