Accès aux variables externes dans les méthodes de classe PHP
Tenter d'accéder directement à une variable globale ($db
) à partir d'une méthode de classe (par exemple, get_records
dans la classe pagi
) entraîne une erreur. Cela est dû à une portée variable ; les variables globales ne sont pas automatiquement disponibles dans les méthodes de classe. La solution consiste à transmettre explicitement la variable dans la classe.
Solution : Injection de dépendances
La meilleure approche est l’injection de dépendances. Cela implique de transmettre l'objet nécessaire (dans ce cas, l'objet de la base de données) en argument au constructeur de classe ou directement à la méthode. Cela maintient la classe indépendante des variables globales, améliorant ainsi la maintenabilité et la testabilité du code.
Méthode 1 : Injection via Constructeur
<code class="language-php">class Paginator { protected $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); } } $pagination = new Paginator($db); // Pass the DB object $records = $pagination->get_records("SELECT * FROM `table`");</code>
Méthode 2 : injecter directement dans la méthode
Vous pouvez également transmettre l'objet de base de données directement à la méthode :
<code class="language-php">class Paginator { public function get_records($q, DB_MySQL $db) { $x = $db->query($q); return $db->fetch($x); } } $pagination = new Paginator(); $records = $pagination->get_records("SELECT * FROM `table`", $db); // Pass DB object to method</code>
Recommandation : Injection de constructeur
Bien que les deux méthodes fonctionnent, l'injection de constructeur (méthode 1) est généralement préférée. Il favorise le couplage lâche, rendant le code plus modulaire, testable et plus facile à maintenir. L'injection de méthode directe (méthode 2) peut rendre le code moins lisible et plus difficile à refactoriser. Évitez de vous fier à des variables globales autant que possible.
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!