2010-03-22 7 views
1

Nous utilisons instantiate et mettons les objets critiques du système dans $GLOBALS pour un accès facile de n'importe où (par exemple DB, cache, utilisateur, etc.).Poussez une variable dans la portée globale?

Nous utilisons tellement $GLOBALS que cela réduirait (oui, vraiment) la quantité de code si je pouvais le référencer comme $G = &$GLOBALS pour un appel sténographique. Le problème est que, par mon expérience et plusieurs heures de googling, je n'ai trouvé aucune construction en PHP qui vous permet de 'flag' un var comme global, rendant $GLOBALS première classe, et tout le reste de deuxième classe.

Ai-je raté quelque chose? Est-ce possible?

Répondre

1
global $variable; //? 
+1

Ceci ouvre uniquement un trou dans une portée établie, il n'est pas proactif pour percer les portées enfant. – Spot

2

Au lieu de mettre tout en $GLOBALS vous voudrez peut-être jeter un coup d'oeil dans le registry concept qui est répandu dans le monde php. Cependant, avoir beaucoup de variables/objets globaux est un signe de mauvaise conception et de couplage élevé. En utilisant quelque chose comme $G garantit le code spaghetti et un cauchemar d'entretien à venir. Qui se soucie si vous pouvez laisser tomber la quantité de code par quelques caractères?

+0

Nous ne mettons pas tout dans '$ GLOBALS'. Il y a peut-être huit (8) objets dans '$ GLOBALS'. Si quelque chose est critique pour le système, c'est qu'il est requis sur tous les pageload & on y accède très souvent, nous le mettons dans '$ GLOBALS'. – Spot

+0

Pourquoi ne pas charger le registre avant toute autre opération? – Benoit

+0

Si vous downvote, s'il vous plaît laissez-moi savoir pourquoi je peux apprendre de mes erreurs. – middus

1

En plus du concept de registre Middus indique, il existe plusieurs approches et concepts autour de celui-ci, dont certains vous pouvez trouver dans les réponses à cette question:

In a PHP project, how do you organize and access your helper objects?

+0

C'est un super lien! Merci beaucoup! – Spot

+1

@Pekka, lien brisé, envisagez de mettre à jour cette réponse avec un autre lien! – Zuul

2

Non, mais vous pouvez utilise un petit truc. Créez une fonction globale du même nom que votre var global et renvoyez l'instance globale. Par exemple .:

function db() { 
    return $GLOBALS['db']; 
} 

Vous pouvez maintenant écrire votre code comme:

... 
$stuffs = db()->query("select * from stuff"); 
... 

Vous pouvez reconnaître comme une variante sur le motif de singleton, mais un syntaxiquement beaucoup plus agréable.

D'autres l'ont mentionné, mais vous devez également considérer et non en utilisant des objets globaux en premier lieu. Je préfère généralement passer des objets là où c'est nécessaire (injection de dépendance). Je ne suis pas trop trouvé du modèle de registre cependant.

+0

L'idée de fonction globale est intéressante. Il ajoute un autre appel de fonction sur la plupart des appels système, mais cela peut en valoir la peine. Pour être clair, nous avons littéralement 8 objets dans GLOBALS, et ce sont des objets instanciés qui sont utilisés _constantly_. Notre système est complètement autonome. Nous n'utilisons aucun code tiers. Nous n'avons eu aucun problème avec cela, dans cinq ans et plus. Je comprends la préoccupation concernant les données mondiales, mais cela ne s'applique pas vraiment à cela. Nous faisons très attention aux données globales. Nous avons même mis tous nos contrôleurs dans des fermetures, juste pour être en sécurité. :) Merci pour la réponse – Spot

4
<?php 

function &G($name) { 
    if(func_num_args() > 1) { 
     $GLOBALS[$name] = func_get_arg(1); 
    } 
    return $GLOBALS[$name]; 
} 


G('test', 'hey'); 

echo G('test'); // outputs hey 
echo $test; // outputs hey 

$b =& G('test'); 
$b = 'hello'; 

echo G('test'); // outputs hello 
echo $test; // outputs hello