Vermeiden Sie die Verwendung globaler Variablen beim Zugriff auf die Datenbank in PHP-Klassen
In Ihrem Code ist beim Versuch, auf eine globale Variable pagi
in einer $db
-Klassenmethode zuzugreifen, ein Fehler aufgetreten. Dieser Fehler weist darauf hin, dass die Methode query()
für ein Nicht-Objekt aufgerufen wurde, was darauf hinweist, dass die Variable $db
in der Klasse nicht verfügbar ist.
Abhängigkeitsinjektionslösung
Der empfohlene Weg, dieses Problem zu lösen, besteht darin, die Abhängigkeitsinjektion zu verwenden und das Datenbankobjekt als Parameter an die Klasse zu übergeben, anstatt sich auf globale Variablen zu verlassen. Ein Beispiel ist wie folgt:
<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>
In diesem Beispiel erstellen wir eine neue Klasse namens Paginator
, die das DB_MySQL
-Objekt als Abhängigkeit über den Konstruktor übergibt. Dadurch wird die Datenbankinstanz in die Klasse eingefügt und für die darin enthaltenen Methoden verfügbar gemacht.
Vorteile der Abhängigkeitsinjektion
Die Verwendung der Abhängigkeitsinjektion hat die folgenden Vorteile:
DB_MySQL
-Klasse, wodurch sie flexibler und einfacher zu testen ist. global
macht die Abhängigkeitsinjektion deutlich, dass die Klasse von einer bestimmten Abhängigkeit abhängt. Andere Methoden
Eine andere Möglichkeit, auf das Datenbankobjekt zuzugreifen, besteht darin, es direkt in die Methode einzufügen, die es benötigt, wie folgt:
<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>
Im Allgemeinen wird jedoch die Abhängigkeitsinjektion über Konstruktoren bevorzugt, da sie eine bessere Kapselung und Testbarkeit bietet.
Das obige ist der detaillierte Inhalt vonWie kann ich globale Variablen beim Zugriff auf eine Datenbank in einer PHP-Klasse vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!