Lorsque vous utilisez PHP pour les opérations de base de données, la classe PDOSTATION fournit une variété de méthodes pour extraire les résultats de la requête. Parmi eux, FetchObject () est un moyen très pratique de cartographier directement les résultats de la requête en objets. Cet article discutera en détail des différences entre l'utilisation et l'utilisation dans fetchObject () , les scénarios d'utilisation spécifiques et leurs différences de performance.
La méthode fetchObject () prend une ligne du jeu de résultats et le renvoie comme un objet. Par défaut, il renvoie une instance de STDClass , mais peut également être transmis dans un nom de classe personnalisé afin que le résultat de la requête devienne un objet d'un type spécifique.
L'utilisation de base est la suivante:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');
$stmt = $pdo->query('SELECT id, name FROM users');
// Utilisé par défaut stdClass
$user = $stmt->fetchObject();
echo $user->name;
// En utilisant des classes personnalisées
class User {
public $id;
public $name;
public function greet() {
return "Hello, " . $this->name;
}
}
$stmt->execute(); // Réexécuter la requête
$user = $stmt->fetchObject('User');
echo $user->greet();
?>
Caractéristiques : Objets vides intégrés PHP. Les attributs sont ajoutés dynamiquement, sans aucune méthode.
Avantages : frais généraux de création légers et minimales, aucune définition préalable requise.
Inconvénients : seules les données peuvent être stockées, mais la logique comportementale ne peut pas être jointe.
Convient aux scénarios:
Des données temporaires sont nécessaires.
Aucune opération commerciale supplémentaire n'est requise sur l'objet de données.
Traitement rapide des résultats de requête simples, tels que des listes de présentation ou un retour API simple.
Exemple:
$user = $stmt->fetchObject();
echo $user->name; // Lisez directement les propriétés
Si vous souhaitez emballer rapidement ces données dans JSON:
echo json_encode($user);
Très simple et direct, avec les meilleures performances.
Caractéristiques : Vous pouvez définir vos propres méthodes, méthodes magiques (telles que __Construct , __get ) et les contraintes de type d'attribut.
Avantages : les objets stockent non seulement des données, mais aussi la logique, et sont plus conformes au principe de la POO (programmation orientée objet).
Inconvénients : il y a une certaine surcharge lors de l'instanciation, en particulier lorsque des constructeurs complexes.
Convient aux scénarios:
L'objet de données doit être lié à la logique métier.
Les propriétés doivent être traitées uniformément (comme les champs de mise en forme automatique des dates, de chiffrement et de décryptage, etc.).
J'espère que le code est plus maintenable et testable.
Suivez le modèle MVC et DDD (conception basée sur le domaine) dans des projets à grande échelle.
Exemple:
class Product {
public $id;
public $name;
public function getDisplayName() {
return strtoupper($this->name);
}
}
$stmt = $pdo->query('SELECT id, name FROM products');
$product = $stmt->fetchObject('Product');
echo $product->getDisplayName();
Cela rend non seulement les données claires en un coup d'œil, mais augmente également l'évolutivité ultérieure.
projet | STDClass par défaut | Cours personnalisés |
---|---|---|
Vitesse d'instanciation | Extrêmement rapide (intégré) | Légèrement lent (nécessite une instanciation de la classe d'utilisateurs) |
Utilisation de la mémoire | Extrêmement bas | Légèrement plus élevé (y compris la définition de la méthode) |
flexibilité | Inférieur | haut |
Volume de données approprié | Grande quantité de données | Données de petit et moyen |
D'une manière générale, lorsque vous devez traiter plus de milliers de lignes de grands ensembles de données et que vous n'avez aucune exigence particulière pour le comportement des objets, l'utilisation de STDClass a les meilleures performances .
Si vous traitez la logique métier un par un , comme le traitement de formulaire, la modélisation d'objets de domaine et la réponse API REST, les classes personnalisées sont plus appropriées .
Si votre classe personnalisée a un constructeur et que le constructeur a des paramètres, FetchObject rencontrera des problèmes. Parce que FetchObject appelle le constructeur sans paramètre par défaut. Si vous devez passer des paramètres, vous pouvez utiliser le deuxième paramètre:
$user = $stmt->fetchObject('User', ['param1', 'param2']);
Cependant, il convient de noter que lors du passage des paramètres, PDO appellera le constructeur avant l'affectation d'attribut .
La classe par défaut STDCLASS : rapide et simple, adapté aux scénarios de lecture de données simples et de performances.
Classe personnalisée : fortement extensible, adapté aux scénarios comportementaux structurés et riches, adaptés aux projets moyens et grands.
Différence de performance : STDClass est plus rapide et plus économique, mais dans les applications à petite échelle, les différences de performances dans les classes personnalisées sont généralement négligeables.
La méthode que vous choisissez dépend de la taille de votre projet, de la complexité commerciale et des coûts de maintenance futurs .
S'il s'agit d'une API légère, telle que https://api.gitbox.net/user/List , STDClass peut être suffisante;
S'il s'agit d'un grand système commercial, comme la logique de traitement des commandes d'une plate-forme de commerce électronique, il est plus raisonnable d'utiliser des classes personnalisées!