PHP: “Global” Comprennent
Situation actuelle:
- J'ai le version actuelle de mon Framework MVC qui utilise des classes en tant que contrôleurs.
- J'ai quelques "vintage", les modules de mon vieux MVC Framework qui utilise de simples, plat comprend des contrôleurs.
Beaucoup plus simple que cela signifie:
Nouvelle Version:
<?PHP
class blaController extends baseController {
private $intVar;
function dosomethingFunction() {
$this->intVar = 123;
$this->view('myView');
}
}
?>
Ancienne Version:
<?PHP
$globalVar = 123;
//view "controllername" is automatically shown
?>
Je vais maintenant essayer d'écrire un wrapper pour être en mesure d'utiliser mon vieux contrôleurs dans mon nouveau MVC sans avoir à réécrire tout. Pour ce faire, j'ai un "wrapper" contrôleur:
class wrapController extends baseController {
function dosomethingFunction() {
require 'old_dosomething.function.php';
$this->view('old_dosomething_view');
}
}
(Encore une fois: C'est TRÈS, TRÈS simplifié - juste pour se faire une idée. Pas de code.)
Le problème avec cette approche est que le précédemment variable globale $globalVar maintenant existe uniquement à l'intérieur de la méthode "dosomethingFunction" et ne sont pas accessibles par la vue.
Ce ne serait pas le cas si je pouvais forcer le besoin de se comporter comme "dans la portée globale", de sorte que $globalVar serait de nouveau disponible dans la portée globale.
Donc: Est-il un moyen de parvenir "require_global" ou quelque chose de similaire?
(Une solution pour mon problème serait de modifier mon vieux contrôleurs de commencer avec un tas de "global" des commandes, mais je préférerais une solution où je n'ai pas à changer une grande partie de l'ancien code.)
(Note: s'il vous Plaît ne me dites pas que GLOBALES sont mauvais. Il passe complètement à côté de la point de cette question. Juste accepter que c'est une obligation de conserver quelques vieux code de travail dans une nouvelle, l'assainissement de l'environnement.)
OriginalL'auteur BlaM | 2009-04-15
Vous devez vous connecter pour publier un commentaire.
Vous pouvez ajouter des variables locales définies dans dosomethingFunction() à la portée mondiale:
Noter, que pour que cela fonctionne comme prévu, vous devriez appeler exiger avant d'utiliser tout autre chose dans la fonction. get_defined_vars() renvoie uniquement les variables de l'étendue actuelle, donc pas de array_diff hacks sont nécessaires.
eh bien, $GLOBAL n'est pas vraiment "normal" de la matrice. Restaurée foreach version.
OriginalL'auteur vartec
C'est la solution la plus simple je pense.
Utiliser le get_defined_vars() fonction deux fois et obtenir un diff de chaque appel afin de déterminer quelles variables ont été introduites par le fichier requis.
Exemple:
Bon point. Mais ce n'est certainement possible que quelqu'un, plus tard, ajoute les variables de la fonction.
array_diff_assoc échoue si l'une des variables est un objet qui ne peut pas être converti en chaîne.
mais si vous appelez get_defined_vars() avant de plus les variables sont ajoutées, elles vous obtiendrez seulement ceux du fichier inclus.
OriginalL'auteur Matt
Hmmm, c'est une question que j'ai jamais vu. Je suppose que vous pourriez faire ce
Mais c'est un assez long processus manuel ainsi, en fonction du nombre de variables globales dont nous parlons. Je vais y réfléchir, mais je ne sais pas du tout automatique "magie" de la solution sur le dessus de ma tête.
OriginalL'auteur Peter Bailey
Pour tous ceux qui sont intéressés: Ma (jusqu'à présent) version finale:
Moche, mais ça fonctionne. Merci à tous pour votre aide précieuse!
OriginalL'auteur BlaM
Avez-vous essayé Zend_Registry de Zend Framework?
Le registre est un conteneur pour stocker des objets et des valeurs dans l'espace d'application. En stockant la valeur dans le registre, le même objet est toujours disponible tout au long de votre application. Ce mécanisme est une alternative à l'utilisation du stockage global.
http://framework.zend.com/manual/en/zend.registry.html
... et je ne vois pas comment Zend_Registry est mieux qu'un simple tableau pour stocker des choses...
OriginalL'auteur