Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 21-07-2009 10:12:00

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

[Singleton]Un truc qui m'échappe

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:

Code:

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

Code:

Mon_Singleton::maMethodeInconnue();

, il ne passe pas dans la méthode __call, par contre en faisant

Code:

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


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#2 21-07-2009 11:05:14

aelyta1
Membre
Lieu: Rouen
Date d'inscription: 29-06-2009
Messages: 98

Re: [Singleton]Un truc qui m'échappe

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 ?


veni, vidi, riendi
Vive les lapins-antilopes !

Hors ligne

 

#3 21-07-2009 11:21:13

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Singleton]Un truc qui m'échappe

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)


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#4 21-07-2009 11:23:19

Phil
Membre
Lieu: Lyon
Date d'inscription: 10-10-2008
Messages: 58

Re: [Singleton]Un truc qui m'échappe

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 :

Code:

//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 wink)

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

 

#5 21-07-2009 11:33:28

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Singleton]Un truc qui m'échappe

Oui non mais je sais tout ça smile

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.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#6 21-07-2009 11:39:59

etaty
Membre
Date d'inscription: 16-10-2008
Messages: 49

Re: [Singleton]Un truc qui m'échappe

__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

wink

Hors ligne

 

#7 21-07-2009 11:56:35

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Singleton]Un truc qui m'échappe

ha ! bon ben j'ai plus qu'à mettre à jour PHP en 5.3, fallait bien le faire de toute façon smile

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)


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#8 21-07-2009 12:24:21

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [Singleton]Un truc qui m'échappe

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.

Code:

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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages