首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 物件與陣列雙向轉換:最佳實踐與陷阱

     編輯:PHP 相關知識

PHP 物件與陣列雙向轉換:最佳實踐與陷阱

API 開發、配置解析、模板渲染中頻繁需要物件↔陣列互轉。PHP 提供多種方式,各有優劣。

方法一:強制類型轉換(最簡單)

$obj = (object) ['name' => 'Tom', 'age' => 25];
$arr = (array) $obj;
print_r($arr); // ['name' => 'Tom', 'age' => 25]

缺點:私有/受保護屬性鍵名會包含 \0 前綴(如 \0ClassName\0prop),序列化/JSON 會洩露結構。

方法二:json_encode/decode(乾淨但有損失)

$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,用強制轉換 + 手動清理鍵名
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved