|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | |||
|
Membre régulier
![]() Inscription : décembre 2009 Messages : 44 ![]() |
Bonsoir,
J'essaye desespérement depuis quelques temps de mettre en place le design pattern Singleton pour pouvoir me connecter à ma base de donnée Voici d'abord mon code de Singleton : Code :
Code :
$bdd = Connection::getInstance()->getBdd(); Citation:
Merci de votre aide, et bonne soirée ! |
|||
|
|
00
|
|
|
#2 |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
$this->val pas $this->$val
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#3 | ||||
|
Membre chevronné
![]() Développeur Web Inscription : mars 2011 Messages : 399 ![]() |
En plus de ce que dit stealth (syntaxe des attributs de l'objet), le pattern n'est pas très bon ici.
Code :
Or, dans le constructeur de Connection, vous mettez dans $instance un objet PDO... Donc à chaque fois que vous appelerez getInstance(), il instanciera un nouveau Connection. Ce serait plus un truc comme ça : Code :
__________________
Membre de StackOverflow, je suis un fervant utilisateur de PHP et de jQuery. Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web mais aussi plusieurs projets personnels. Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, un raccourcisseur d'url, un bookmarklet pour envoyer l'url de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc... |
||||
|
00
|
|
|
#4 |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
autant faire juste un instanceof PDO
__________________
http://blog.stealth35.com/ |
|
|
10
|
|
|
#5 | ||
|
Membre chevronné
![]() Développeur Web Inscription : mars 2011 Messages : 399 ![]() |
Moui, mais tu perds la possibilité de surcharger avec tes propres méthodes.
Code :
Connection::getInstance()->getAllArticles(); Or, rien ne t'empêche avec ma classe de faire : Code :
__________________
Membre de StackOverflow, je suis un fervant utilisateur de PHP et de jQuery. Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web mais aussi plusieurs projets personnels. Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, un raccourcisseur d'url, un bookmarklet pour envoyer l'url de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc... |
||
|
00
|
|
|
#6 |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
__________________
http://blog.stealth35.com/ |
|
|
10
|
|
|
#7 | ||||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
@stealth - je savais en ouvrant le post que tu lui fourguerait ta classe.
+1 à Stealth, son singleton factory est exactement ce qu'il te faut. Au passage, faire en sorte que les classes modèles utilisent un singleton revient exactement à mettre l'instance PDO dans les variables globales, c'est sale. Exemple: Code :
Code :
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||||
|
00
|
|
|
#8 | |
|
Membre chevronné
![]() Développeur Web Inscription : mars 2011 Messages : 399 ![]() |
Citation:
Mais au final, son titre est plutôt bon : c'est une usine à Singleton et ça ne résout en rien son interrogation (à moins que je ne l'ai pas compris.) créera bien une instance unique de singleton (ou la récupèrera) mais aucune méthode ne pourra y être ajoutée. créera une instance de sa classe mais il ne saura pas la gérer (je pense). C'est gentil de me montrer, ce serait mieux de lui expliquer. @Benjamin : Au final ton dernier exemple est une évolution de mon exemple. L'avantage étant la possibilité d'avoir des connections à plusieurs bases en même temps. Quoi qu'il en soit, pour moi, un Singleton pour gérer la base de donnée est quasiment une hérésie. En cas d'évolution, on est bien embêté. C'est pour cela que je préfère soit la dernière proposition, soit la mienne
__________________
Membre de StackOverflow, je suis un fervant utilisateur de PHP et de jQuery. Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web mais aussi plusieurs projets personnels. Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, un raccourcisseur d'url, un bookmarklet pour envoyer l'url de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc... |
|
|
00
|
|
|
#9 | |||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Citation:
Citation:
Citation:
On peut voir la classe de Stealth en quelque sorte comme une Data Identity Map: son rôle est de servir des instances et de s'assurer qu'elles sont uniques. Mais ça reste une évolution de la notion de "variable globale" au fond...
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|||
|
00
|
|
|
#10 |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
si on veux rajouter des méthode il fait étendre PDO donc creer ca classe Connection comme une classe normale et le SingletonFactory la rendra en Singleton comme ça plus besoin de s’embêter
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#11 | ||||
|
Membre chevronné
![]() Développeur Web Inscription : mars 2011 Messages : 399 ![]() |
Citation:
Citation:
Le mélange des 2 patterns est néanmoins ingénieux. Citation:
Citation:
Au final, on s'est bien éloigné de sa question d'ailleurs ![]() (et aucun retour de sa part
__________________
Membre de StackOverflow, je suis un fervant utilisateur de PHP et de jQuery. Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web mais aussi plusieurs projets personnels. Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, un raccourcisseur d'url, un bookmarklet pour envoyer l'url de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc... |
||||
|
00
|
|
|
#12 | ||
|
Membre régulier
![]() Inscription : décembre 2009 Messages : 44 ![]() |
Shikiryu, effectivement je vois le problème de instanceof, je vais changer ça.
stealth, j'ai regardé ton Singleton Factory, mais ça m'a paru bien compliqué Benjamin, si je fais ta méthode qui consiste, si j'ai bien compris, à mettre une variable dans chaque classe qui contiendra l'instance de PDO, je n'ai plus besoin du singleton, c'est ça ? Citation:
Citation:
|
||
|
|
00
|
|
|
#13 | ||||||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Selon moi, le plus propre serait d'avoir:
Code :
Code :
Voilà donc ma version de Singleton: Code :
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||||||
|
00
|
|
|
#14 |
|
Membre régulier
![]() Inscription : décembre 2009 Messages : 44 ![]() |
OK OK, par contre je comprends pas trop comment marche le deuxième code.
Quand tu fais Singleton:: PDO(), qu'est ce qui est appelé, __callStatic() ? |
|
|
00
|
|
|
#15 | |
![]() ![]() Inscription : septembre 2010 Messages : 7 103 ![]() |
Citation:
__________________
http://blog.stealth35.com/ |
|
|
|
00
|
|
|
#16 |
|
Membre régulier
![]() Inscription : décembre 2009 Messages : 44 ![]() |
D'accord, je viens de comprendre comment marche __callStatic, mais c'est quoi l'intérêt de faire ça par rapport à créer une méthode classique tout simplement ?
|
|
|
00
|
|
|
#17 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
C'est plus pratique et plus esthétique de faire:
Que Code :
Singleton::factory("PDO", array($dsn, $user, $pwd));
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|
10
|
|
|
#18 |
|
Membre régulier
![]() Inscription : décembre 2009 Messages : 44 ![]() |
Bon alors là je suis perdu, je vois plus du tout comment faire pour récupérer mon instance de PDO.
A quelle endroit je dois créer mon objet PDO ? L'héritage d'Object n'est pas reconnu par wamp, et quand je l'enlève, et que je fais Singleton: |
|
|
00
|
|
|
#19 | ||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Citation:
Citation:
Si ta version de PHP est inférieure à 5.3.0, tu ne peux pas utiliser la méthode magique __callStatic.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||
|
00
|
|
|
#20 |
|
Membre régulier
![]() Inscription : décembre 2009 Messages : 44 ![]() |
Mais l'objet PDO je suis censé le créer dans le singleton non ? Sinon il sert à rien...
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com