2009-08-05 6 views
6

Ich habe eine Datenbank-Klasse, die eine Instanz in der Haupt index.php alsKann ich eine Variable global sichtbar machen, ohne sie global in jedem Konstruktor einer PHP-Klasse deklarieren zu müssen?

$db = new Database(); 

Gibt es eine Möglichkeit für die $db Variable global

, ohne in allen anderen Klassen anerkannt werden
global $db; 
zu erklären erklärt

im Konstruktor jeder Klasse?

+0

Benötigen Sie es wirklich für alle anderen Klassen? –

+0

Nicht alle, aber eine erhebliche Menge. –

Antwort

16

Nein. Sie müssen Global $ db im Konstruktor jeder Klasse deklarieren.

oder Sie können das globale Array verwenden: $ _GLOBALS ['vars'];

Die einzige Möglichkeit, dies zu umgehen, ist die Verwendung einer statischen Klasse, die Singleton Method genannt wird (siehe Here für eine Erklärung). Aber das ist sehr schlechte Praxis.

class myClass 
    { 
    static $class = false; 
    static function get_connection() 
    { 
     if(self::$class == false) 
     { 
      self::$class = new myClass; 
     } 
     else 
     { 
      return self::$class; 
     } 
    } 
    // Then create regular class functions. 
    } 

Die Singleton-Methode wurde erstellt, um sicherzustellen, dass es nur eine Instanz einer Klasse gibt. Aber, weil die Leute es als eine Möglichkeit verwenden, globalling zu kürzen, wird es als faule/schlechte Programmierung bekannt.

Stackoverflow Wissen
How to Avoid Using PHP Global Objects
Share Variables Between Functions in PHP Without Using Globals
Making a Global Variable Accessible For Every Function inside a Class
Global or Singleton for Database Connection

+0

Warum der Downvote? –

+0

Ich freute mich, dass die Singleton-Methode nicht die richtige Antwort darauf war. Aber ich habe es aufgenommen, weil es "technisch" verwendet werden kann. –

+0

Ich war nicht die Down-Abstimmung, danke, dass Sie mich wissen lassen - ich möchte schlechte Praktiken vermeiden. –

1

Sie

$GLOBALS['db']->doStuff(); 

oder alternativ mit einer Art von Singleton Zugriffsmethode

verwenden könnte
Database::getInstance()->doStuff(); 
+0

Sind beide Methoden schlechte Praktiken? Ist es die beste Vorgehensweise, die Datenbankklasse innerhalb jeder Klasse nur als global zu deklarieren? –

0

Sie könnten eine Registry Klasse verwenden, um Ihre Database Instanz zu speichern und abzurufen.

class Registry 
{ 
    protected static $_data = array(); 

    public static function set($key, $value) 
    { 
     self::$_data[$key] = $value; 
    } 

    public static function get($key, $default = null) 
    { 
     if (array_key_exists($key, self::$_data)) { 
      return self::$_data[$key]; 
     } 

     return $default; 
    } 
} 

Registry::set('db', new Database()); 
$db = Registry::get('db'); 
+0

Das ist im Grunde eine Singleton-Klasse für Daten .... –

+0

so ist $ GLOBALS ... –

+0

Ausgenommen '$ GLOBALS' und das 'global' Schlüsselwort sind in die Sprache eingebaut und sind daher schnell und allen bekannt. Ihre Registrierungsklasse ist nicht und fügt keine zusätzliche Funktionalität hinzu. Eine Art "Options" -Klasse könnte nützlich sein, um App-Optionen zu speichern, aber selbst diese könnte wahrscheinlich durch ein assoziatives Array ersetzt werden. –

1

Warum nicht eine Klasse, die die global $db; darin Konstruktor enthält, dann alle anderen Klassen von diesem verlängern?

2

Ich mache es ein bisschen anders. Ich habe normalerweise ein globales Anwendungsobjekt (App). Innerhalb dieses Objekt kann ich einige grundlegende Initialisierung wie meine db Erstellen von Objekten, Objekte das Caching usw.

Ich habe auch eine globale Funktion, die die App-Objekt zurückgibt .... also (Anwendungsobjektdefinition nicht dargestellt):

define('APPLICATION_ID', 'myApplication'); 

${APPLICATION_ID} = new App; 

function app() { 
    return $GLOBALS[APPLICATION_ID]; 
} 

So dann kann ich so etwas wie die überall in jedem folgenden Code verwenden, um Objekte innerhalb des globalen Objekts zu verweisen:

app()->db->read($statement); 
app()->cache->get($cacheKey); 
app()->debug->set($message); 
app()->user->getInfo(); 

es ist nicht perfekt, aber ich finde es Dinge einfacher in vielen Fällen zu machen.

Verwandte Themen