Kann ich eine Variable global sichtbar machen, ohne sie global in jeder einzelnen PHP-Klasse Konstruktor deklarieren zu müssen?

StackOverflow https://stackoverflow.com/questions/1234445

Frage

Ich habe eine Datenbank-Klasse, die eine Instanz im Haupt index.php als

deklarierte
$db = new Database();

Gibt es eine Möglichkeit für die $db Variable global in allen anderen Klassen anerkannt werden, ohne zu erklären, die

global $db;

im Konstruktor jeder Klasse?

War es hilfreich?

Lösung

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

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

Der einzige Weg, dies zu umgehen ist eine statische Klasse zu verwenden, um es zu wickeln, die so genannten Singleton-Methode (Siehe Hier für eine Erklärung). Das ist aber 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.
   }

wurde Die Singleton-Methode erstellt, um sicherzustellen, gibt es nur eine Instanz einer Klasse. Aber, weil die Menschen es als eine Möglichkeit, globalling abzukürzen, es wird bekannt als faul / schlechte Programmierung.

Stackoverflow Wissen
Wie Vermeiden der Verwendung von PHP Globale Objekte
Teile Variablen Zwischen Funktionen in PHP ohne Globals Mit < br> machen eine globale Variable Zugänglich für jede Funktion innerhalb einer Klasse
Globale oder Singleton für Datenbank-Verbindung

Andere Tipps

Ich mache es ein wenig anders. Ich habe in die Regel ein globales Anwendungsobjekt (App). Innerhalb dieses Objekt kann ich einige grundlegende Initialisierung wie meine db Erstellen von Objekten, Objekte zwischenspeichern, etc.

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 machen in vielen Fällen.

Sie können verwenden

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

oder alternativ eine Art von Singleton Zugriffsmethode mit

Database::getInstance()->doStuff();

Warum nicht eine Klasse erstellen, die global $db; darin Konstruktor enthält, dann erweitern Sie alle anderen Klassen das?

Sie können 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');
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top