我們需要跟深入地瞭解這種機制,看對象的“本”。對象是什麼?對象在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變量的存儲結構的底層實現,以後在深入的介紹。
通過對上述源代碼的簡單閱讀,可以更清晰地認識到對象也是一種很普通的變量,不同的是其懈怠了對象的屬性和類的入口。