Maison >base de données >tutoriel mysql >Comment puis-je éviter les variables globales lors de l'accès à une base de données dans une classe PHP ?

Comment puis-je éviter les variables globales lors de l'accès à une base de données dans une classe PHP ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-18 00:17:09359parcourir

How Can I Avoid Global Variables When Accessing a Database in a PHP Class?

Évitez d'utiliser des variables globales lors de l'accès à la base de données dans les classes PHP

Votre code a rencontré une erreur en essayant d'accéder à une variable globale pagi dans une méthode de classe $db. Cette erreur indique que la méthode query() a été appelée sur un non-objet, ce qui indique que la variable $db n'est pas disponible dans la classe.

Solution d'injection de dépendance

La méthode recommandée pour résoudre ce problème consiste à utiliser l'injection de dépendances et à transmettre l'objet de base de données en tant que paramètre dans la classe au lieu de s'appuyer sur des variables globales. Un exemple est le suivant :

<code class="language-php">$db = new DB_MySQL("localhost", "root", "", "test");
include_once("pagi.php");

$pagination = new Paginator($db);
$records = $pagination->get_records("SELECT * FROM `table`");</code>
<code class="language-php">class Paginator
{
    private $db;

    public function __construct(DB_MySQL $db)
    {
        $this->db = $db;
    }

    public function get_records($q)
    {
        $x = $this->db->query($q);
        return $this->db->fetch($x);
    }
}</code>

Dans cet exemple, nous créons une nouvelle classe appelée Paginator qui transmet l'objet DB_MySQL en tant que dépendance via le constructeur. Cela injecte l'instance de base de données dans la classe, la rendant disponible pour les méthodes qu'elle contient.

Avantages de l'injection de dépendances

L'utilisation de l'injection de dépendances présente les avantages suivants :

  • Découplage : Il découple une classe de sa dépendance directe sur la classe DB_MySQL, la rendant plus flexible et plus facile à tester.
  • Testabilité : Les tests unitaires deviennent plus faciles car vous pouvez simuler les dépendances et isoler les classes de test.
  • Évitez les dépendances cachées : Contrairement à l'utilisation du mot-clé global, l'injection de dépendance indique clairement que la classe dépend d'une dépendance spécifique.

Autres méthodes

Une autre façon d'accéder à l'objet de la base de données est de l'injecter directement dans la méthode qui le nécessite, comme ceci :

<code class="language-php">$db = new DB_MySQL("localhost", "root", "", "test");
include_once("pagi.php");

$pagination = new Paginator();
$records = $pagination->get_records("SELECT * FROM `table`", $db);</code>
<code class="language-php">class Paginator
{
    public function get_records($q, DB_MySQL $db)
    {
        $x = $db->query($q);
        return $db->fetch($x);
    }
}</code>

Cependant, l'injection de dépendances via des constructeurs est généralement préférée car elle offre une meilleure encapsulation et une meilleure testabilité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn