php conteneur de classe: pourquoi tout le monde utilise le plus compliqué de la méthode?
Quand je trouve des scripts php ou regarder des frameworks php, je vois un "registre de classe" ou un "conteneur de classe", qui contient souvent des variables ou d'autres objets en utilisant l' __magic méthode.
Voici un exemple simpliste de ce que je veux dire:
exemple 1:
class container {
private $objects;
public function __get($class){
if(isset($this->objects[$class])){
return $this->objects[$class];
}
return $this->objects[$class] = new $class();
}
}
l'exemple ci-dessus auront plus de fonctions lors de la création de la classe au lieu de simplement l'appeler, mais pour mon exemple, il devrait être suffisant.
"exemple 1" c'est ce que j'ai surtout le voir dans les scripts téléchargés à partir d'internet, il maintient une seule et unique instance de la classe, maintenant ce que je me pose, c'est que, ne serait-ce pas exemple faire la même chose et d'être plus efficaces:
exemple 2:
class simplecontainer {
public function __get($class){
return $this->$class = new $class();
}
}
Mais je n'ai jamais voir "exemple 2" chez les autres peuples de scripts qui me fait réfléchir à deux fois, avant même de penser à l'utiliser.
J'ai testé conteneur vs simplecontainer aide de plusieurs classes qu'ils contiennent et de la réutilisation de l'ordre de 100000 fois et "exemple 1" ne 0.75 secondes sur ma machine locale, et "exemple 2" il en 0,29 secondes.
qui dois-je utiliser mes scripts? exemple 1 ou 2? et pourquoi?
Je l'ai testé avec 3 objets différents, et qu'il détient tous les 3, ou le fait que j'ai mal compris ce que tu voulais dire?
Peut-être que je suis surplombant sg mais comment voulez-vous référer à ces différents objets?
$container = new simplecontainer(); $container->testclass->test();
ce que vous avez écrit, il n'a pas de sens. C'est ce que j'appelle compliqué et aussi inutile.
OriginalL'auteur Timo Huovinen | 2010-09-15
Vous devez vous connecter pour publier un commentaire.
Parce que dans le vôtre, je ne peux pas faire ça:
Votre version s'appuie sur aucun nom de la classe comme un membre privé de l'objet conteneur. Ok, alors il devrait être simple à éviter, mais serait une douleur à la poursuite d'un bug. Coffre-fort de codage signifie moins de stress.
Il fait vomit un peu bizarre le comportement de PHP (pas de surprise). Le simplecontainer dans mon exemple renvoie un
foo
objet à l'appelant et puis se met totalement différentes de l'un à la méthode privée dans le conteneur. Voyant que la façon dont les objets sont destinés à obtenir passée par référence, c'est un peu loufoque.la fonction unset() dans votre exemple me semble qu'il ne fait rien? bien, rien à modifier le résultat, au moins.
oui, c'est d'une grande perspicacité dans les quirkyness de php xD, m'a fallu un certain temps pour comprendre les différences, mais est d'une valeur inestimable pour moi au moins. Merci de m'aider à corriger ma confusion!!
Avait quelque chose dans ma tête sur l'effacement des références quand je l'ai écrit. Comme vous le dites, ils sont totalement inutiles.
OriginalL'auteur Mike
Sans d'abord exemple2 ne pas définir les objets que
protected
ouprivate
ce qui signifie quesimplecontainer::objects
sera un membre du public qui peut être écrasé comme:$container->className = new SomethingElse();
oui, im correcte, elle n'est appelée lors de la création de l'objet et il les stocke pour l'avenir, de sorte que votre deuxième point, c'est mal.
Ouais vous êtes à la droite... j'ai négligé le fait qu'il n'était pas de les ranger dans un
objects
membre... mauvais modifier. bonne prise.vous ne comprenez pas encore.
donc, la raison pour laquelle ils utilisent l'exemple 1, c'est juste pour une sauvegarde contre les gens de réécriture de l'objet?
OriginalL'auteur prodigitalson