Globales sont inévitables.
C'est un vieux débat, mais je tiens encore à ajouter quelques réflexions parce que je m'ennuie d'eux dans les réponses. Ces réponses simplifier ce mondial, c'est trop et de présenter des solutions qui ne sont pas toutes les solutions à ce problème. Le problème est: quelle est la bonne façon de traiter avec une variable globale et l'utilisation du mot-clé global? Pour ce faire, nous devons d'abord examiner et de décrire ce mondial.
Jetez un oeil à ce code de Zend - et s'il vous plaît comprendre que je ne suggérons pas que Zend est mal écrit:
class DecoratorPluginManager extends AbstractPluginManager
{
/**
* Default set of decorators
*
* @var array
*/
protected $invokableClasses = array(
'htmlcloud' => 'Zend\Tag\Cloud\Decorator\HtmlCloud',
'htmltag' => 'Zend\Tag\Cloud\Decorator\HtmlTag',
'tag' => 'Zend\Tag\Cloud\Decorator\HtmlTag',
);
Il y a beaucoup de invisible ici de dépendances. Ces constantes sont en fait des classes.
Vous pouvez également voir require_once dans certaines pages de ce cadre. Require_once mondial de dépendance, d'où la création de dépendances externes. C'est inévitable pour un cadre. Comment pouvez-vous créer une classe comme DecoratorPluginManager sans beaucoup de code externe dont il dépend? Il ne peut pas fonctionner sans beaucoup d'extras. En utilisant le Zend framework, avez-vous déjà changé la mise en œuvre d'une interface? Une interface est en fait un mondial.
Un autre utilisé mondialement application est Drupal. Ils sont très préoccupés par la bonne conception, mais comme tout grand cadre, ils ont beaucoup de dépendances externes. Jetez un oeil à la globals dans cette page:
/**
* @file
* Initiates a browser-based installation of Drupal.
*/
/**
* Root directory of Drupal installation.
*/
define('DRUPAL_ROOT', getcwd());
/**
* Global flag to indicate that site is in installation mode.
*/
define('MAINTENANCE_MODE', 'install');
// Exit early if running an incompatible PHP version to avoid fatal errors.
if (version_compare(PHP_VERSION, '5.2.4') < 0) {
print 'Your PHP installation is too old. Drupal requires at least PHP 5.2.4. See the <a href="http://drupal.org/requirements">system requirements</a> page for more information.';
exit;
}
// Start the installer.
require_once DRUPAL_ROOT . '/includes/install.core.inc';
install_drupal();
Jamais écrit une redirection vers la page de connexion? C'est la modification d'une valeur globale. (Et puis, n'êtes-vous pas dire "WTF", qui je considère comme une bonne réaction de mauvaise documentation de votre application.) Le problème avec les variables globales est pas qu'ils sont globales, vous en avez besoin afin d'avoir un sens de l'application. Le problème est la complexité de l'ensemble de l'application qui peut en faire un cauchemar à gérer.
Les Sessions sont globales, $_POST est un mondial, DRUPAL_ROOT est mondiale, les includes/installer.de base.inc " est une inmodifiable mondiale. Il y est grand monde en dehors de toute fonction qui est nécessaire afin de laisser la fonction de faire son travail.
La réponse de Gordon est incorrect, parce qu'il surfait à l'indépendance d'une fonction et l'appel d'une fonction un menteur est simplifier à l'extrême la situation. Fonctions de ne pas mentir et quand vous prenez un coup d'oeil à son exemple, la fonction est conçue mal son exemple est un bug. (En passant, je suis d'accord avec cette conclusion qu'il faut découpler le code).
La réponse de deceze n'est pas vraiment une bonne définition de la situation. Les fonctions de toujours fonctionner au sein d'un champ d'application plus large et son exemple est beaucoup trop simpliste. Nous serons tous d'accord avec lui que la fonction est complètement inutile, parce qu'elle renvoie une constante. Cette fonction est de toute façon une mauvaise conception. Si vous voulez montrer que la pratique est mauvais, s'il vous plaît venez avec un exemple pertinent. Renommage de variables dans une application n'est pas grave d'avoir une bonne IDE (ou un outil). La question est à propos de la portée de la variable, pas la différence de champ d'application avec la fonction. Il y a un bon moment pour une fonction à exercer son rôle dans le processus (c'est pourquoi il est créé en premier lieu), et, à la bonne heure peut-il influencer le fonctionnement de l'application dans son ensemble, et donc également de travailler sur des variables globales.
La réponse de xzyfer est une déclaration sans argumentation. Globales sont tout aussi présents dans une application si vous avez des fonctions de procédure ou de la programmation orientée objet design. Les deux façons de changer la valeur d'un mondial sont essentiellement les mêmes:
function xzy($var){
global $z;
$z = $var;
}
function setZ($var){
$this->z = $var;
}
Dans les deux cas est la valeur de $z changé à l'intérieur d'une fonction spécifique. Dans les deux modes de programmation vous pouvez faire ces changements dans un tas d'autres endroits dans le code. On pourrait dire que l'aide globale, vous pourriez l'appeler $z n'importe où et à changer. Oui, vous le pouvez. Mais allez-vous? Et quand fait inapte, doit-il donc pas être appelé un bug?
Bob Fanger commentaires sur xzyfer.
Devrait-on alors simplement utiliser quoi que ce soit et surtout le mot-clé "global"? Non, mais juste comme n'importe quel type de conception, d'essayer d'analyser ce qu'il dépend et ce qui en dépend. Essayez de savoir quand il change et comment il change. Évolution des valeurs globales, ne devrait se produire avec les variables qui peuvent changer à chaque requête/réponse. C'est uniquement à ceux des variables qui font partie du flux fonctionnel d'un processus, et non pas à sa mise en œuvre technique. La redirection d'une URL vers la page de connexion appartient au flux fonctionnel d'un processus, la mise en œuvre de la classe utilisée pour une interface à la mise en œuvre technique. Vous pouvez modifier cette dernière durant les différentes versions de l'application, mais ne devrait pas modifier ceux-ci à chaque requête/réponse.
Afin de mieux comprendre quand c'est un problème de travailler avec des variables globales et le mot-clé global et quand ne pas vais-je introduire la phrase suivante, qui vient de Wim de Bie lors de l'écriture sur les blogs:
Personnels oui, privés non". Lorsqu'une fonction est en train de changer la valeur d'une variable globale dans le souci de son propre fonctionnement, alors je les appel que l'usage privé d'une variable globale et un bug. Mais quand le changement de la variable globale est faite pour le bon traitement de la demande dans son ensemble, comme la redirection de l'utilisateur vers la page de connexion, alors c'est qu'à mon avis, éventuellement, un bon design, pas par définition mauvais et certainement pas un anti-modèle.
Rétrospectivement, les réponses de Gordon, deceze et xzyfer: ils ont tous des 'private oui" (et les bugs) en sont des exemples. C'est pourquoi ils se sont opposés à l'utilisation de variables globales. J'aimerais en faire trop. Cependant, ils ne viennent pas avec les personnels oui, privés n'-exemples comme j'ai fait dans cette réponse plusieurs fois.