Lorsque vous utilisez PDO de PHP (PHP Data Objets) pour faire fonctionner une base de données, il existe de nombreuses façons d'obtenir des résultats de requête. Pdostatement :: fetchObject () et Pdostatement :: fetch () (avec PDO :: fetch_num pour réaliser un effet "fetchrow") sont les deux façons les plus courantes. Mais de nombreux développeurs se demandent souvent: lequel devrais-je choisir? Quelles sont les différences entre elles en termes de performances, de structure et de commodité d'utilisation? Cet article vous amènera à acquérir une compréhension approfondie de leurs similitudes et des différences et des scénarios applicables.
$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;
Valeur de retour : renvoyez un objet, qui est une instance de STDClass par défaut, et peut également être instancié dans une classe personnalisée.
Méthode d'accès : méthode d'attribut ( $ user-> name )
Haute lisibilité , adaptée à un accès structuré aux données.
Bien qu'il n'y ait pas de méthode fetchrow () , fetch (pdo :: fetch_num) peut être considéré comme sa méthode correspondante:
$stmt = $pdo->query("SELECT id, name, email FROM users");
$row = $stmt->fetch(PDO::FETCH_NUM);
echo $row[1]; // name
Valeur de retour : renvoyez le tableau d'index (chaque colonne est organisée par des touches numériques)
Méthode d'accès : méthode d'index ( $ row [0] , $ row [1] )
Il est plus adapté aux cas où la structure des données est connue et l'ordre de colonne est fixé.
Articles de comparaison | fetchObject () | fetch (PDO :: fetch_num) |
---|---|---|
Type de retour | Objet (par défaut stdclass) | Tableau (tableau d'index) |
Accès aux attributs | $ obj-> propriété | $ row [0] |
Évolutivité | Le nom de classe peut être transmis et les attributs de classe peuvent être remplis automatiquement | Impossible de mapper automatiquement |
performance | Légèrement lent (créer un objet) | Un peu plus rapide (pur tableau) |
lisibilité | Plus haut | en général |
Scénarios d'utilisation recommandés | ORM, développement orienté objet, sortie de structure claire | Sortie simple de rapport, traitement par lots, traitement des données temporaires |
L'utilisation de fetchObject () est très appropriée, elle peut directement cartographier les résultats en objets, ce qui rend le traitement de logique métier ultérieur plus naturel et plus clair.
class User {
public $id;
public $name;
public $email;
}
$stmt = $pdo->query("SELECT id, name, email FROM users");
$user = $stmt->fetchObject("User");
echo $user->email;
Scénarios appropriés: projet de niveau d'entreprise, architecture DDD, objet de retour d'interface Restful
L'utilisation de Fetch (PDO :: fetch_num) peut améliorer les performances, éviter la création d'objets inutile et avoir un contrôle clair sur l'ordre sur le terrain.
while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
echo implode(",", $row) . PHP_EOL;
}
Convient pour les scénarios: traitement par lots, exportation de données CSV, système de rapports rapide
Bien que FetchObject () offre une lisibilité plus élevée, puisque chaque enregistrement génère un objet, il fonctionne un peu pire que Fetch (PDO :: fetch_num) lors du traitement de grandes quantités de données. Prenez 100 000 éléments de données à titre d'exemple:
fetchObject () : prend environ 1,5 seconde
Fetch (PDO :: fetch_num) : prend environ 1,1 seconde
L'environnement de test est basé sur MySQL 8.0 et PHP 8.1 local, et l'adresse du code de test est: https://gitbox.net/test/pdo_benchmark.php
Si vous construisez des couches d'API, ORM ou d'encapsulation de classe, il est recommandé d'utiliser fetchObject () .
Si vous traitez avec des rapports temporaires et bien structurés ou des données par lots, il est plus approprié de choisir Fetch (PDO :: fetch_num) .
Sélectionnez des objets lorsque la lisibilité est préférée et sélectionnez les tableaux lorsque les performances sont préférées.
Scène | Méthode recommandée |
---|---|
Traitement orienté objet | fetchObject () |
Traversez et exportez rapidement les données | fetch (PDO :: fetch_num) |
Besoin d'encapsulation de données structurées claires | fetchObject () |
Très grande quantité de données, poursuivant des performances extrêmes | fetch (PDO :: fetch_num) |
En bref, les deux ont leurs propres forces et ce n'est qu'en les utilisant raisonnablement que l'efficacité maximale de l'APD peut être exercée.