Heim >Datenbank >MySQL-Tutorial >Wie vermeide ich den Fehler „Aufruf einer Mitgliedsfunktion query() für ein Nicht-Objekt' mithilfe der Abhängigkeitsinjektion?

Wie vermeide ich den Fehler „Aufruf einer Mitgliedsfunktion query() für ein Nicht-Objekt' mithilfe der Abhängigkeitsinjektion?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-18 00:23:11922Durchsuche

How to Avoid

Vermeiden globaler Variablen in Klassenmethoden: Ein Beispiel für die Paginierung

Beim Erstellen der Paginierungsfunktionalität kann der Fehler „Aufruf einer Mitgliedsfunktion query() für ein Nicht-Objekt“ auftreten. Dies ist häufig auf den Zugriff auf außerhalb einer Klasse deklarierte Variablen innerhalb der Klasse selbst zurückzuführen. Lassen Sie uns nach besseren Lösungen suchen.

Abhängigkeitsinjektion: Der bevorzugte Ansatz

Abhängigkeitsinjektion bietet eine saubere Lösung. Anstatt uns auf globale Variablen zu verlassen, übergeben wir die erforderlichen Objekte (wie die Datenbankverbindung) direkt an die Klasse. Dies geschieht über den Konstruktor:

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

$pagination = new Paginator($db);
$records = $pagination->get_records("SELECT the, fields, you, want, to retrieve FROM `table`");

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);
    }
}</code>

Methode Injektion: Eine Alternative

Alternativ können Sie das Datenbankobjekt direkt in die Methode einfügen, die es benötigt:

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

$pagination = new Paginator();
$records = $pagination->get_records("SELECT the, fields, you, want, to retrieve FROM `table`", $db);

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

Warum Dependency Injection überlegen ist

Abhängigkeitsinjektion bietet erhebliche Vorteile gegenüber der Verwendung globaler Variablen:

  • Explizite Abhängigkeiten: Der Code zeigt deutlich, wovon jede Klasse abhängt, und verbessert so die Lesbarkeit und Wartbarkeit.
  • Loose Kopplung: Klassen sind nicht eng an bestimmte Implementierungen gebunden. Sie können Datenbanksysteme oder andere Abhängigkeiten problemlos austauschen, ohne die Kernklassenlogik zu ändern.
  • Testbarkeit: Unit-Tests werden viel einfacher. Sie können Abhängigkeiten beim Testen leicht simulieren und so die zu testende Klasse isolieren.

Zusammenfassend lässt sich sagen, dass die Abhängigkeitsinjektion eine bewährte Methode zur Verwaltung von Abhängigkeiten und gemeinsam genutzten Ressourcen ist und saubereren, robusteren und testbareren Code fördert. Vermeiden Sie die Fallstricke globaler Variablen, indem Sie diesen Ansatz übernehmen.

Das obige ist der detaillierte Inhalt vonWie vermeide ich den Fehler „Aufruf einer Mitgliedsfunktion query() für ein Nicht-Objekt' mithilfe der Abhängigkeitsinjektion?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn