許多開發者誤以為 stdClass 是所有類別的基類,實際上它只是 PHP 核心保留的一個「空」類別,沒有任何屬性與方法,專門用於動態屬性掛載。
在 Zend/zend_builtin_functions.c 的模組初始化函數中:
ZEND_MINIT_FUNCTION(core) {
zend_class_entry class_entry;
/* 註冊 stdClass 類別 */
INIT_CLASS_ENTRY(class_entry, "stdClass", NULL);
zend_standard_class_def = zend_register_internal_class(&class_entry TSRMLS_CC);
/* 註冊預設類別、介面如 Exception、SPL 類別等 */
zend_register_default_classes(TSRMLS_C);
return SUCCESS;
}
可見 INIT_CLASS_ENTRY 的方法表傳入 NULL,表示無任何成員方法、魔術方法、父類別或介面皆設為 NULL。
class EmptyClass {}
$object = new EmptyClass();
var_dump($object instanceof stdClass); // 輸出 bool(false)
結果證明自訂類別並不繼承 stdClass。
$obj = new stdClass(); $obj->foo = 'bar';json_decode($json, false) 預設回傳 stdClass 實例stdClass 是內部保留類別,初始化時無屬性、無方法、所有魔術方法為 NULL,可被繼承但無實質意義,核心用途是提供一個「即刻可用」的物件容器。