Position actuelle: Accueil> Derniers articles> Scénarios de sélection et d'application de Pdostation :: FetchObject et Pdostation :: FetchRow

Scénarios de sélection et d'application de Pdostation :: FetchObject et Pdostation :: FetchRow

gitbox 2025-05-29

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.

1. Concepts de base

1. fetchObject ()

 $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.

2. Fetch (PDO :: fetch_num)

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é.

2. Comparaison des différences de base

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

3. Analyse de scénario applicable

Scénario 1: Création d'un objet de données (DTO / Entité)

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

Scénario 2: exportation de données, génération de table

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

4. Mesure réelle des différences de performance

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

5. Suggestions de meilleures pratiques

  • 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.

6. Résumé

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.