Puis-je rendre une variable globalement visible sans avoir à la déclarer globale dans le constructeur de chaque classe PHP?

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

Question

J'ai une classe de base de données, dont une instance est déclarée dans le principal index.php en tant que

$db = new Database();

La variable $ db peut-elle être reconnue de manière globale dans toutes les autres classes sans avoir à déclarer

global $db;

dans le constructeur de chaque classe?

Était-ce utile?

La solution

Non. Vous devez déclarer Global $ db dans le constructeur de chaque classe.

ou vous pouvez utiliser le tableau Global: $ _GLOBALS ['vars'];

Pour contourner ce problème, il suffit d'utiliser une classe statique, appelée méthode Singleton, (voir ici pour une explication). Mais c’est une très mauvaise pratique.

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

La méthode singleton a été créée pour s’assurer qu’il n’y avait qu’une instance de toute classe. Mais, parce que les gens l’utilisent comme moyen de raccourcir la globalisation, on l’appelle programmation paresseuse / mauvaise.

Connaissances StackOverflow
Comment éviter d'utiliser des objets globaux PHP
Partager des variables entre des fonctions en PHP sans utiliser de globes < br> Rendre une variable globale accessible pour chaque fonction dans une classe
Global ou Singleton pour la connexion à la base de données

Autres conseils

Je le fais un peu différemment. J'ai généralement un objet d'application global (App). Dans cet objet, je fais quelques initialisations de base comme la création d’objets de base de données, la mise en cache d’objets, etc.

J'ai également une fonction globale qui renvoie l'objet App .... ainsi (la définition d'objet d'application n'est pas affichée):

define('APPLICATION_ID', 'myApplication');

${APPLICATION_ID} = new App;

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

Je peux donc utiliser quelque chose comme ce qui suit dans n'importe quel code pour référencer des objets dans l'objet global:

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

Ce n'est pas parfait, mais je trouve que cela facilite les choses dans de nombreuses circonstances.

vous pourriez utiliser

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

ou en utilisant une sorte de méthode d'accès singleton

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

Pourquoi ne pas créer une classe contenant le global $ db; dans son constructeur, puis en étendre toutes les autres classes?

Vous pouvez utiliser une classe Registry pour stocker et récupérer votre instance Database .

class Registry
{
    protected static 

Vous pouvez utiliser une classe Registry pour stocker et récupérer votre instance Database .

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

Vous pouvez utiliser une classe Registry pour stocker et récupérer votre instance Database .

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

Vous pouvez utiliser une classe Registry pour stocker et récupérer votre instance Database .

<*>data)) { return self::

Vous pouvez utiliser une classe Registry pour stocker et récupérer votre instance Database .

<*>data[$key]; } return $default; } } Registry::set('db', new Database()); $db = Registry::get('db');
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top