stdClass 是 PHP 內建的空白類別,沒有任何預設屬性與方法。實例化後可動態新增屬性,常用於:
$obj->key vs $arr['key'])// 建立空物件並動態賦值
$user = new stdClass();
$user->name = '張三';
$user->email = 'zhangsan@example.com';
$user->roles = ['admin', 'editor'];
// 物件轉關聯陣列
$arr = get_object_vars($user);
print_r($arr);
/* 輸出:
Array (
[name] => 張三
[email] => zhangsan@example.com
[roles] => Array ( [0] => admin [1] => editor )
) */
與陣列的「複製語意」不同,物件預設為「參考傳遞」。這在處理大量資料時可節省記憶體:
$original = new stdClass();
$original->data = str_repeat('x', 1000000); // 1MB 字串
$ref = $original; // 參考同一物件
$ref->data = 'modified'; // 修改會影響 $original
echo $original->data; // 輸出:modified
// 對比陣列行為
$arr = ['data' => str_repeat('x', 1000000)];
$copy = $arr; // 實際複製 1MB 記憶體
$copy['data'] = 'changed'; // 不影響 $arr
function apiResponse($success, $data = null, $message = '') {
$resp = new stdClass();
$resp->success = $success;
$resp->data = $data;
$resp->message = $message;
$resp->timestamp = time();
return $resp;
}
// 使用時
$response = apiResponse(true, ['user_id' => 123], '登入成功');
echo $response->data->user_id; // 123
// 陣列 → 物件 $arr = ['id' => 1, 'name' => '商品A', 'price' => 99.9]; $obj = (object) $arr; // 或 json_decode(json_encode($arr)) // 物件 → 陣列 $arrAgain = (array) $obj; // 僅轉換第一層 // 深層轉換建議: $deepArr = json_decode(json_encode($obj), true);
function connectDB(stdClass $config) {
$dsn = "mysql:host={$config->host};dbname={$config->dbname};charset={$config->charset}";
// ...
}
connectDB((object)[
'host' => 'localhost',
'dbname' => 'myapp',
'charset' => 'utf8mb4'
]);
| 特性 | stdClass 物件 | 關聯陣列 |
|---|---|---|
| 記憶體佔用 | 較低(參考傳遞) | 較高(複製語意) |
| 存取速度 | 略快 | 標準 |
| JSON 序列化 | 原生支援 | 原生支援 |
| 型別提示 | 可用 stdClass | 僅 array |
| 動態屬性 | 支援 | 支援 |
最佳實踐:固定結構資料建議使用
class或readonly class(PHP 8.1+) 以獲得型別安全與 IDE 提示;臨時、動態、或需頻繁參考傳遞的資料適合用stdClass。
// 錯誤:嘗試存取不存在屬性不會報錯,回傳 null
$obj = new stdClass();
var_dump($obj->missing); // NULL
// 建議搭配 isset() 或 property_exists()
if (property_exists($obj, 'name')) { ... }