2010-09-29 20 views
5

Ich habe eine Datenbank-Klasse, die zum Auswählen, Aktualisieren, Löschen MySQL Abfragen verwendet wird.Wie kann man auf ein Objekt einer anderen Klasse zugreifen?

Nun möchte ich eine MySQL-Abfrage innerhalb einer anderen Klasse erstellen, aber wenn ich $db = new DB(); in index.php definieren, kann ich nicht die $db var in einer anderen Klasse. Muss ich die Variable $db immer wieder definieren, wenn ich eine Abfrage machen möchte? Oder gibt es eine Möglichkeit, die $db Var mit einem Objekt global var zu machen?

Antwort

0

In Ihrer index.php Datei Verwendung

require_once('path_to_file_with_class.php'); 

Sie auch include_once verwenden können, die Sie anstelle eines Fehlers eine Warnung geben, wenn die ‚path_to_file_with_class.php‘ Datei nicht verfügbar ist.

-1

Man könnte es als global in der index.php definieren, und in der Klasse Konstruktor setzen auch $this->db &= $GLOBALS['db'];

5

Sie wollen wahrscheinlich ein singleton. Auf diese Weise können Sie eine Instanz der Datenbank an einer beliebigen Stelle im Code abrufen. Dann, wo immer Sie eine Abfrage durchführen möchten, tun Sie zuerst $db = DB::getInstance();.

Eine Alternative ist dependency injection, die eine DB-Instanz an alle Klassen übergibt, die eine benötigen.

+0

Ein Beispiel für die Singletonmuster in PHP finden Sie hier: http://www.weberdev.com/get_example-4002.html – Zilverdistel

+0

Um ein Objekt global verfügbar Sie nur eine statische Methode müssen es instanziiert . Es muss nicht Singleton sein. Beides ist stinkend, also ist Dependency Injection der richtige Weg. – Gordon

0

Definieren Sie es für eine Klasse (separate PHP Datei). Dann fordern Sie es für jede PHP-Datei, in der die Var benötigt wird.

0

Zuerst machen Sie Ihre Datenbank-Klasse eine singleton. Und dann in der neuen Klasse können Sie so etwas wie:

class myNewClass{ 
    private $_db; 

    public function __construct(){ 
    $this->_db = DB::getInstance(); 
    } 
} 
0

Verwenden Sie die magische Funktion __autoload().

11

Der sauberste Ansatz wäre aggregate die Datenbankklasse, wo injecting es erforderlich ist. Alle anderen Ansätze, wie die Verwendung des Schlüsselwortes global oder die Verwendung von static Methoden, geschweige denn eines Singleton, führen zu einer engen Kopplung zwischen Ihren Klassen und dem globalen Geltungsbereich, wodurch die Anwendung schwieriger zu testen und zu warten ist. Just do

// index.php 
$db = new DBClass;    // create your DB instance 
$foo = new SomeClassUsingDb($db); // inject to using class 

und

class SomeClassUsingDb 
{ 
    protected $db; 
    public function __construct($db) 
    { 
     $this->db = $db; 
    } 
} 

Verwenden Constructor Injection wenn die Abhängigkeit erforderlich ist, einen gültigen Zustand für die Instanz zu erstellen. Wenn die Abhängigkeit optional ist oder zur Laufzeit austauschbar sein muss, verwenden Sie Setter Injection, z.

class SomeClassUsingDb 
{ 
    protected $db; 
    public function setDb($db) 
    { 
     $this->db = $db; 
    } 
} 
+0

Und wie genau benutze ich die $ db var als? $ this-> db-> select(); ? – Mike

+0

@Mike ja, genau so. Oder durch einen Getter (wenn du einen geschrieben hast) – Gordon

Verwandte Themen