在使用PHP 的PDO(PHP Data Objects)操作數據庫時,獲取查詢結果的方式多種多樣,其中PDOStatement::fetchObject()和PDOStatement::fetch() (配合PDO::FETCH_NUM實現類似“fetchRow”效果)是最常見的兩種方式。但很多開發者經常疑惑:我到底該選哪一個?它們在性能、結構、使用便利性上有什麼區別?本文將帶你深入了解它們的異同和適用場景。
$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "password");
$stmt = $pdo->query("SELECT id, name, email FROM users");
$user = $stmt->fetchObject();
echo $user->name;
返回值:返回一個對象,默認是stdClass的實例,也可以傳入類名實例化為自定義類。
訪問方式:屬性方式( $user->name )
可讀性高,適合結構化訪問數據。
雖然沒有fetchRow()這個方法, fetch(PDO::FETCH_NUM)可以視作其對應方式:
$stmt = $pdo->query("SELECT id, name, email FROM users");
$row = $stmt->fetch(PDO::FETCH_NUM);
echo $row[1]; // name
返回值:返回索引數組(每列是按數字鍵排列)
訪問方式:索引方式( $row[0] , $row[1] )
更適合數據結構已知且列順序固定的情況。
對比項 | fetchObject() | fetch(PDO::FETCH_NUM) |
---|---|---|
返回類型 | 對象(默認stdClass) | 數組(索引數組) |
屬性訪問 | $obj->property | $row[0] |
可擴展性 | 可傳入類名,自動填充類屬性 | 無法自動映射為類 |
性能 | 稍慢(創建對象) | 稍快(純數組) |
可讀性 | 較高 | 一般 |
推薦使用場景 | ORM、面向對像開發、清晰結構輸出 | 簡單報表輸出、批量處理、臨時處理數據 |
使用fetchObject()非常合適,它能將結果直接映射為對象,使得後續業務邏輯處理更加自然、清晰。
class User {
public $id;
public $name;
public $email;
}
$stmt = $pdo->query("SELECT id, name, email FROM users");
$user = $stmt->fetchObject("User");
echo $user->email;
適合場景:企業級項目、DDD 架構、RESTful 接口返回對象
使用fetch(PDO::FETCH_NUM)可以提升性能,避免不必要的對象創建,同時對字段順序有明確控制。
while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
echo implode(",", $row) . PHP_EOL;
}
適合場景:批量處理、數據導出CSV、快速報表系統
雖然fetchObject()提供了更高的可讀性,但由於每條記錄都會生成一個對象,它在處理大量數據時性能略遜於fetch(PDO::FETCH_NUM) 。以10 萬條數據為例:
fetchObject() :大約耗時1.5 秒
fetch(PDO::FETCH_NUM) :大約耗時1.1 秒
實測環境基於本地MySQL 8.0 和PHP 8.1,測試代碼地址: https://gitbox.net/test/pdo_benchmark.php
如果你在構建API、ORM 或類封裝層,推薦使用fetchObject() 。
如果你處理的是臨時性、結構明確的報表或批量數據,選擇fetch(PDO::FETCH_NUM)更合適。
可讀性優先時選對象,性能優先時選數組。
場景 | 推薦方法 |
---|---|
面向對象處理 | fetchObject() |
快速遍歷、導出數據 | fetch(PDO::FETCH_NUM) |
需要結構清晰的數據封裝 | fetchObject() |
數據量非常大、追求極限性能 | fetch(PDO::FETCH_NUM) |
總之,兩者各有所長,合理使用,才能發揮PDO 的最大效能。