API 開發、配置解析、模板渲染中頻繁需要物件↔陣列互轉。PHP 提供多種方式,各有優劣。
$obj = (object) ['name' => 'Tom', 'age' => 25]; $arr = (array) $obj; print_r($arr); // ['name' => 'Tom', 'age' => 25]
缺點:私有/受保護屬性鍵名會包含 \0 前綴(如 \0ClassName\0prop),序列化/JSON 會洩露結構。
$arr = json_decode(json_encode($obj), true);
DateTime、Closure、資源型別會丟失;循環引用報錯;效能較差。function objectToArray($obj) {
if (is_object($obj)) $obj = (array) $obj;
if (is_array($obj)) {
return array_map('objectToArray', $obj);
}
return $obj;
}
function arrayToObject($arr, $class = 'stdClass') {
if (!is_array($arr)) return $arr;
$obj = new $class();
foreach ($arr as $k => $v) {
$obj->$k = arrayToObject($v);
}
return $obj;
}
interface Arrayable {
public function toArray(): array;
public static function fromArray(array $data): self;
}
class User implements Arrayable {
public $name; public $email;
public function toArray() { return ['name' => $this->name, 'email' => $this->email]; }
public static function fromArray(array $data) {
$u = new self(); $u->name = $data['name'] ?? ''; $u->email = $data['email'] ?? ''; return $u;
}
}
| 場景 | 推薦方法 |
|---|---|
| 快速原型、簡單 DTO | 強制轉換 / json |
| API 序列化、配置導出 | json_encode/decode |
| 複雜嵌套、需保留型別 | 自定義遞歸 / 實現 Arrayable |
| 高效能、高頻調用 | 避免 json,用強制轉換 + 手動清理鍵名 |