Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Une petite question d'ordre générale sur les singleton en php.
Lorsque que j'appelle une méthode de mon Singleton directement:
Mon_Singleton::maMethode();
Sans l'instancier, sans getInstance(), directement, et bien ça fonctionne.
Maintenant, j'implémente la méthode "__call" dans mon singleton. Lorsque que je fais
Mon_Singleton::maMethodeInconnue();
, il ne passe pas dans la méthode __call, par contre en faisant
Mon_Singleton::getInstance()->maMethodeInconnue();
il y a passe.
Donc pourquoi dans le premier cas je n'ai pas besoin de passer par un getInstance() ? et pourquoi dans le second oui ?
Je précise de nouveau, que je n'ai ni new ni getInstance(), dans le premier cas on dirait qu'il instancie automatiquement le singleton.
Une idée ?
Merci,
A+ benjamin
Hors ligne
Je ne suis pas une experte mais l'appel dans le tout premier cas est un appel statique, non ? d'ou le fait de ne pas passer par un instance ?
Hors ligne
Oui. Ce que je ne comprend pas c'est pourquoi il ne passe pas dans la méthode __call quand j'appelle une méthode qui n'existe pas de façon static.
A+ benjamin.
Dernière modification par Delprog (21-07-2009 11:21:23)
Hors ligne
Le but du singleton est de fournir une instance unique de l'objet.
Logiquement l'utilisation du singleton se fait de la manière suivant :
//On récupère la seule instance disponible de son objet $obj = Mon_Singleton::getInstance(); $obj->methode(); //on utilise la méthode
(c'est un peu comme quand on utilise le Zend_Registry )
Donc si ta première méthode marche c'est surement que c'est une méthode déclarée en static..
mais normalement ça ne devrait pas fonctionner.
Dernière modification par Phil (21-07-2009 11:28:33)
Hors ligne
Oui non mais je sais tout ça
Et justement la méthode n'est pas static !
Je cherche à piger. Je n'ai à aucun moment créé d'instance du singleton. Juste l'appel static à la méthode.
A+ benjamin.
Hors ligne
__callStatic() est lancé lorsque l'on invoque des méthodes inaccessibles dans un contexte statique.
http://fr2.php.net/manual/fr/language.o … oading.php
Hors ligne
ha ! bon ben j'ai plus qu'à mettre à jour PHP en 5.3, fallait bien le faire de toute façon
Avant la 5.3 il n'existe aucune solution ?
C'est ce que je cherchais merci.
Dernière modification par Delprog (21-07-2009 11:57:00)
Hors ligne
il y a une grande différence entre les méthodes statiques d'une classe et l'appel d'une méthode d'un objet.
MaClasse::maMethodeStatique();
est un peu comme un appel de fonction c'est comme si tu avait une fonction don le nom serait MaClasse::maMethodeStatique il n'y a pas d'objet en jet et donc pas d'attribut.
alors que sur un singleton tu as un objet et tu appelle une méthode de l'objet. que ton objet soit unique ou pas c'est une instance de ta classe et il est géré exactement de la même façon.
tu vas donc avoir dans ce cas un objet avec des méthodes et des attributs.
pour bien voir ce qu'est un singleton il suffit de le dévoyer. écris une classe en implémentant le design pattern singleton mets là en œuvre. puis dans ta classe tu rends le constructeur public et tu crée une instance. tu n'a plus de signleton mais tu peut constater que ton objet à exactement le même comportement que ton singleton précédemment crée.
en fait le singleton est un moyen de palier un manque de certain langage à objet qui ne connaissent que la notion de classe et d'instance. dans ces langages il est impossible de définir un objet unique avec le langage il faut en passer par un mécanisme qui vas empêcher la création d'instance multiple. ce que propose le design pattern singleton.
mais ta question était légitime sur le __call. dans php5.3 les méthodes magique voient leurs capacités étendues au méthodes de classes
pour en revenir à la différence entre statique et singleton la question qui peut se poser est "quand utiliser une classe purement statique et quand utiliser un singleton"
une classe statique peut avoir des attributs statiques et finalement on peut obtenir des comportement similaire.
pour y répondre une première question à poser est quel est l'usage de l'élément concerné ?
prenons un exemple des plus farfelu j'ai des animaux donc des classes animalière. ces animaux vivent tranquille et son parfois manipulés par un vétérinaire de la réserve.
chaque instance d'une classe Animal peut donc un jour se retrouver comme objet manipulé par une méthode de mon vétérinaire.
si je veux créer une nouvelle classe pour un animal unique "Le roi des animaux" celui-ci est un être unique. si je veux pouvoir le passer en paramètre à mon véto alors ce doit être un singleton un objet unique. ce ne peut pas être une classe statique
une autre question qui peu aider à choisir est la notion est-elle porteuse d'information ?
si oui il y a beaucoup de chance pour qu'on parte vers un singleton
un objet est l'outil idéal pour porter de l'information.
mais si cette info est marginale cela n'a pas toujours d'intérêt.
par exemple un classe Debug avec une méthode trace
il est intéressant de savoir s'il y a déjà eut une trace (pour ne pas envoyer les headers par exemples)
mais cette information n'est pas d'une importance capitale et pas non plus très lourde. un membre statique fera très bien l'affaire.
alors qu'une connexion à la base de donnée contient nombre d'information sur la base et ces informations sont capitale pour le fonctionnement de la notion.
le partage des attributs
se poser la question du partage des attributs est aussi un moyen de choisir. a priori un attribut statique est destiné à être partagé entre toutes les instances d'une classe.
utiliser un attribut statique pour conserver de façon unique une valeur n'est pas dans l'esprit de la chose.
A+JYT
Dernière modification par sekaijin (21-07-2009 12:44:31)
Hors ligne