Position actuelle: Accueil> Derniers articles> PDOSTATION :: Problèmes de compatibilité FetchObject avec PHP 5 et PHP 7

PDOSTATION :: Problèmes de compatibilité FetchObject avec PHP 5 et PHP 7

gitbox 2025-05-12

Lorsque vous utilisez PHP pour le développement de la base de données, Pdostatement :: FetchObject est une méthode très pratique qui peut dire directement les résultats de la requête dans un objet. Cependant, dans PHP 5 et PHP 7, il existe des différences subtiles mais importantes dans le comportement de FetchObject . Incapable de comprendre ces problèmes de compatibilité, il peut entraîner des erreurs imprévues dans le code sur différentes versions.

Cet article expliquera ces différences en profondeur et fournira des exemples de code réels pour aider à comprendre.

1. Examen de l'utilisation de base

L'utilisation de base de Pdostation :: FetchObject est de saisir une ligne à partir de l'ensemble de résultats en tant qu'objet:

 <?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->query('SELECT id, name FROM users');
$user = $stmt->fetchObject();

echo $user->id;
echo $user->name;
?>

Le retour par défaut est un objet STDClass . Bien sûr, vous pouvez également spécifier un nom de classe personnalisé pour recevoir des données.

2. Différences de compatibilité entre PHP 5 et PHP 7

Différence 1: le moment du constructeur

  • PHP 5 : Une fois l'objet instancié, le constructeur (__construct) est appelé une fois l'attribut attribué .

  • PHP 7 : Lorsqu'un objet est instancié, le constructeur est appelé avant avant l'attribut.

Cela conduit à un problème important: si votre constructeur s'appuie sur certains champs d'initialisation, il peut se comporter complètement différemment dans PHP 5 et PHP 7.

Exemple

Supposons qu'il y ait une classe simple:

 <?php
class User {
    public $id;
    public $name;

    public function __construct() {
        echo "Le constructeur est appelé:id = {$this->id}, name = {$this->name}\n";
    }
}

$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->query('SELECT id, name FROM users LIMIT 1');
$user = $stmt->fetchObject('User');
?>
  • Dans PHP 5 , la sortie peut être:

     Le constructeur est appelé:id = 1, name = John
    
  • Dans PHP 7 , la sortie pourrait être:

     Le constructeur est appelé:id = , name = 
    

Parce que PHP 7 appelle le constructeur avant l'attribut d'attribut!

Différence 2: Modifications des paramètres facultatifs

Dans PHP 5 et 7, la signature de la méthode FetchObject est légèrement différente:

 fetchObject ([ string $class_name = "stdClass" [, array $ctor_args = array() ]] ) : object
  • PHP 5 : support $ class_name et $ ctor_args

  • PHP 7 : Il prend également en charge $ class_name et $ ctor_args , mais après PHP 7.2, la vérification du type de paramètre est plus stricte, par exemple, $ ctor_args doit être un tableau.

Si vous passez en PHP 7, non de la propreté, comme deuxième paramètre, vous contacterez directement l'erreur TypeError .

Exemple

 <?php
// Démonstration d&#39;erreur(PHP 7.2+ Rapportera une erreur)
$user = $stmt->fetchObject('User', 'Fauxctor_args');
?>

La bonne façon de l'écrire devrait être:

 <?php
$user = $stmt->fetchObject('User', ['paramètre1', 'paramètre2']);
?>

Différence 3: Gestion des erreurs lorsque la classe n'existe pas

  • PHP 5 : Si le nom de Class_name spécifié n'existe pas, FetchObject renvoie simplement false .

  • PHP 7 : Si le Name $ spécifié n'existe pas, une exception d'erreur sera directement lancée!

Ainsi, dans PHP 7, vous devez vous assurer que $ class_name est chargé correctement, sinon le code se cassera.

Une approche sûre est:

 <?php
$className = 'User';
if (class_exists($className)) {
    $user = $stmt->fetchObject($className);
} else {
    throw new Exception("gentil {$className} N&#39;existe pas");
}
?>

3. À quoi devriez-vous prêter attention lorsque vous l'utilisez?

  • Si vous comptez sur les champs de base de données dans les constructeurs de classe, assurez-vous de revoir la logique d'initialisation dans PHP 7 pour éviter d'utiliser directement des propriétés qui n'ont pas encore été affectées dans le constructeur.

  • Assurez-vous que le tableau transmis à $ ctor_args est toujours un tableau pour éviter les erreurs de type après PHP 7.2.

  • Avant d'appeler FetchObject , utilisez class_exists pour vérifier si la classe existe pour améliorer la robustesse.

  • Si vous devez être compatible avec PHP 5 et PHP 7, il est recommandé d'utiliser un simple stdclass uniformément et d'attribuer manuellement des valeurs aux objets requis.

4. Matériaux de référence