stdClass 是 PHP 內建的預定義類別,也是最基礎的「空白類別」。它沒有任何屬性與方法,卻因其動態特性,成為快速建立資料傳輸物件(DTO)的首選工具。本文將系統整理 stdClass 的核心特性、建立方式、存取技巧與常見陷阱。
require 或 include。$obj->prop = 'value'),但無法動態新增方法。(object)$array 與 (array)$object 強制轉型,鍵值對完整保留。json_encode() 輸出物件時預設產生 {} 結構,與前端交互極為方便。$user = new stdClass();
$user->id = 101;
$user->name = 'Alice';
$user->roles = ['admin', 'editor'];
$data = ['id' => 101, 'name' => 'Alice'];
$user = (object) $data;
// 等同於 new stdClass() 後逐一賦值
$user = new class {
public $id = 101;
public $name = 'Alice';
};
匿名類別可定義方法,適合需要行為封裝的場景。
$response = new stdClass();
$response->status = 'success';
$response->data = new stdClass();
$response->data->user = new stdClass();
$response->data->user->name = 'Bob';
$response->data->user->tags = ['php', 'oop'];
// 存取
echo $response->data->user->name; // Bob
echo $response->data->user->tags[1]; // oop
| 情境 | 錯誤做法 | 正確做法 |
|---|---|---|
| 重複實例化覆蓋資料 | $obj = (object)$arr; $obj = new stdClass(); 導致前序資料遺失 |
一次實例化,後續只操作屬性 |
| 函式參數傳遞 | 在函式內 &new stdClass() 使用參考 |
直接 new stdClass(),PHP 5 起物件預設參考傳遞 |
| 型別檢查 | is_object($var) && get_class($var) === 'stdClass' |
$var instanceof stdClass 更簡潔 |
若需同時支援 $obj->key 與 $obj['key'],可讓類別實作 ArrayAccess 介面,或直接使用 ArrayObject 替代 stdClass。
stdClass 以「零定義、動態屬性、JSON 友善」三大優勢,成為 PHP 中輕量級資料容器的標準選擇。掌握其建立、轉型、巢狀操作與避坑指南,能顯著提升開發效率與程式碼可讀性。