Je pensais que ce serait plus facile. J'ai passé plusieurs jours pour que tout fonctionne correctement.
L'idée est de mettre en œuvre le schéma suivant conçu ArgoUML :
Autrement dit, une classe de base qui héritent autre.
Le scénario est différent webservices à qui je dois appeler dans l'application. Ce que j'ai fait est la carte chaque webservice avec une classe qui contient les mêmes méthodes que le webservice, de sorte que ce que vous avez à faire contre le webservice est faite contre les mêmes classes avec le même nom et méthodes renvoyant directement les informations retournées.
Depuis le début soulevé que webservices percolés cours d'une classe de base qui a la fonctionnalité commun de tout ce qui est, les appels à des webservices et le contrôle d'erreur et les empêcher dupliquer cette fonctionnalité dans chaque classe.
Plus tard, j'ai décidé que chaque classe doit implémenter le modèle singleton pour s'assurer que n'avait qu'une seule instance de la même classe en tout temps et éviter le code viciase instancier un nouveau chaque fois que vous avez besoin.
La solution globale a été, par conséquent, demander à la classe singleton de parents et de tous ce qu'ils avaient infiltré singleton automatiquement et ne pas avoir à mettre en œuvre dans chaque. Idéalement est agréable, la pratique était bien pire.
Le premier test consistait à déclarer la méthode getInstancia chargé de veiller singleton comme ceci:
- {
- ; $ ReturnValue = null;
- $ Class = _CLASS_;
- $class ( $asurl ) ; self :: $ instance = new $ class (asurl $);
- }
- ; $ ReturnValue = self :: $ instance;
- ; return $ returnValue;
- }
Était censé le faire créerait si n'existe pas, une nouvelle instance de l'objet qui a été appelé, dans notre cas, par exemple, Class1. Mais pour commencer _CLASS_ de test, nous avons réalisé qui ne renvoie pas le nom de la classe que l'on appelle la classe, mais sur lequel il s'exécute, dans ce cas de base, ce qui nous avons servi notre but.
Ensuite, trouver une fonction PHP qui nous donne ce dont nous avons besoin, c'est le nom de la classe nommée: get_called_class. Dommage qui est disponible à partir de PHP 5.3 (en version bêta). Pourtant, nous trouvons une alternative mise en œuvre de cette fonction valable pour les versions antérieures de PHP.
- get_called_class fonction () {
- '/([a-zA-Z0-9 \_ ]+)::' . $bt [ 1 ] [ 'function' ] . '/' , $lines [ $bt [ 1 ] [ 'line' ] -1 ] , $matches ) ; preg_match ('/ ([a-zA-Z0-9 \ _] +) ::'. $ bt [1] ['fonction']. '/', $ lignes [$ bt [1] ['line'] -1], $ matches);
- [ 1 ] ; return $ matches [1];
- }
- }
Avec cela, nous pourrions créer l'instance de classe à partir du singleton nécessaire, mais toujours une surprise nous attendait. Nous ne pouvions pas instancier plus d'une classe (autre) dont héritent du même père, en dépit d'être différents objets héritant suppose que le même il faut utiliser la même instance du singleton et ne laisse comme exemple (la variable code précédent) est déjà générée et autrement.
Prenons un exemple pour mieux voir. Créer une instance de classe 1, le singleton retourner une nouvelle instance, car il n'existe pas. Maintenant, créez une autre classe 2. L'objet renvoyé est de type Class1. Bien que nous voulons créer différents objets (Classe 1 et Classe 2) exemple de base est partagée par les deux. Comme je l'ai instancié Class1, Class1 exemple est de type, qui renvoie d'instancier Class2 exemple déjà créé, Class1. Nous avons pu voir cette instance (la variable) est créé et est du même type que vous souhaitez instancier de nouveau, mais lors de la création de la nouvelle (classe 2) détruirait le vieux (classe 1) avec ce que nous perdrions cet objet, et ce n'est pas ce recherché.
La solution? Semble un peu lourd, mais c'est celle-ci:
Base
- classe osusnet_com_Base
- {
- = ” ; asurl privé = $ »;
- = null ; private $ iVersion = null;
- = ” ; sAsConsumer privé = $ »;
- = 0 ; private $ debug = 0;
- $asurl ) protected function __ construct (asurl $)
- {
- $asurl == "" ) { if ($ asurl == "") {
- ; return false;
- { Else {}
- = $asurl ; $ This -> asurl = $ asurl;
- = 1 ; $ This -> iVersion = 1;
- = "kk" ; $ This -> sAsConsumer = "kk";
- = 0 ; $ This -> debug = 0;
- }
- }
- {
- ; $ ReturnValue = null;
- ; $ Class = get_called_class ();
- $class ] = new $class ( $asurl ) ; self :: $ instance [$ class] = new $ class (asurl $);
- [ $class ] ; $ ReturnValue = self :: $ instance [$ class];
- }
- ; return $ returnValue;
- }
- }
Class1
- osusnet_com_Base classe osusnet_com_Clase1 s'étend osusnet_com_Base
- {
- $cookie ) fonction publique GetUserContext ($ cookie)
- {
- }
- CheckStateUser fonction publique ()
- {
- }
- | Connexion public function ()
- {
- }
- }
C'est, par exemple (variable) devient un tableau où nous stockons un élément pour chaque instance de chacun de la classe enfant. Si nous cherchons un type déjà créé sera de retour cette instance, crée par ailleurs et de le rendre disponible pour les instances suivantes. La base est unique, mais il crée un objet de chaque classe disponible.
Comme tout modèle singleton à utiliser pour ce faire:
- ( $url ) ; $ Instance = osusnet_com_Clase1 :: getInstancia ($ url);
Rappelez-vous que le constructeur est protégé de sorte que toute tentative de vouloir instancier une classe d'entre eux directement échoue, essayez de le faire:
- osusnet_com_Clase1 ( ) ; $ Instance = new osusnet_com_Clase1 ();
Je ne sais pas quel sera le comportement dans d'autres langues, mes années de Java sont déjà un peu en retard, même si la théorie de la programmation orientée objet est le comportement décrit ici ou mauvaise exécution de PHP, je ne suis pas un expert en la théorie de la p Object Oriented ROGRAMMATION. Ma logique me dit que si les instances d'une classe de type, vous devez instancier tous, sans partage de la classe de base, mais aussi tout à fait logique que si toute la gamme de base et il a l'instance singleton et getInstancia où sont statiques, soit commun à tous. Le plus j'y pense, plus je gâchis.
Au moins j'ai trouvé une solution.



































































