Puis-je rendre une variable globalement visible sans avoir à la déclarer globale dans le constructeur de chaque classe PHP?
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?
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');