Posso rendere visibile una variabile a livello globale senza doverla dichiarare globale nel costruttore di ogni singola classe PHP?

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

Domanda

Ho una classe di database, che un'istanza è dichiarata nel index.php principale come

$db = new Database();

C'è un modo per la variabile $ db essere riconosciuta a livello globale in tutte le altre classi senza dover dichiarare

global $db;

nel costruttore di ogni classe?

È stato utile?

Soluzione

No. Devi dichiarare Global $ db nel costruttore di ogni classe.

oppure puoi usare l'array Global: $ _GLOBALS ['vars'];

L'unico modo per aggirare il problema è utilizzare una classe statica per avvolgerla, chiamata Metodo Singleton (vedi Qui per una spiegazione). Ma questa è una pessima pratica.

  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.
   }

Il metodo singleton è stato creato per assicurarsi che esistesse solo un'istanza di qualsiasi classe. Ma poiché la gente lo usa come un modo per scorciatoia, diventa noto come programmazione lazy / bad.

Conoscenza StackOverflow
Come evitare l'uso di oggetti globali PHP
Condividi variabili tra le funzioni in PHP senza usare i globali < br> Rendere accessibile una variabile globale per ogni funzione all'interno di una classe
Global o Singleton per la connessione al database

Altri suggerimenti

Lo faccio in modo leggermente diverso. Di solito ho un oggetto applicazione globale (App). All'interno di quell'oggetto eseguo alcune inizializzazioni di base come la creazione di oggetti db, oggetti cache, ecc.

Ho anche una funzione globale che restituisce l'oggetto App .... quindi (definizione dell'oggetto applicazione non mostrata):

define('APPLICATION_ID', 'myApplication');

${APPLICATION_ID} = new App;

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

Quindi posso usare qualcosa come il seguente in qualsiasi codice per fare riferimento a oggetti all'interno dell'oggetto globale:

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

Non è perfetto, ma lo trovo per rendere le cose più facili in molte circostanze.

puoi usare

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

o in alternativa usando una sorta di metodo di accesso singleton

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

Perché non creare una classe che contiene il global $ db; nel suo costruttore, quindi estendere tutte le altre classi da questo?

È possibile utilizzare una classe Registry per archiviare e recuperare l'istanza Database .

class Registry
{
    protected static 

È possibile utilizzare una classe Registry per archiviare e recuperare l'istanza Database .

<*>data = array(); public static function set($key, $value) { self::

È possibile utilizzare una classe Registry per archiviare e recuperare l'istanza Database .

<*>data[$key] = $value; } public static function get($key, $default = null) { if (array_key_exists($key, self::

È possibile utilizzare una classe Registry per archiviare e recuperare l'istanza Database .

<*>data)) { return self::

È possibile utilizzare una classe Registry per archiviare e recuperare l'istanza Database .

<*>data[$key]; } return $default; } } Registry::set('db', new Database()); $db = Registry::get('db');
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top