É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 :
DB_MySQL
, la rendant plus flexible et plus facile à tester. 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!