|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Bonjour à tous.
Ca fait un moment que je joues avec les singletons en PHP 5.3. Des singletons simples qui portent leur propre instance aux singletons factories en passant par des singletons génériques à hériter (merci le late static binding), j'ai à peu près fait le tour. Il y a 1 semaine, je suis tombé sur un singleton factory remarquablement ingénieux fait par Stealth35. Ce singleton permet l'usage de cette syntaxe: Code :
Voici l'implémentation originale du Singleton: Code :
- en PHP inférieur à 5.3.4, si l'objet qu'on essaie d'instancier n'a pas de constructeur ou que son constructeur ne reçoit pas de paramètres (SplObjectStorage par exemple) ReflectionClass lèves une ReflexionException lors de l'appel de ReflectionClass::newInstanceArgs() - il n'est pas possible (ou difficilement / salement) d'instancier des classes d'un autre namespace que global De plus, ReflectionException semble incappable d'utiliser l'autoloading (et vu que cette classe n'a pratiquement pas de documentation...) C'est pourquoi je me suis permi de l'améliorer légèrement: Code :
E.G. 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
|
|
|
#2 |
![]() ![]() Inscription : septembre 2010 Messages : 7 101 ![]() |
je vais regardé ca plus en detail, sinon je l'ai mise sur github : https://github.com/stealth35/SingletonFactory
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#3 | ||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Si tu mets la classe modifié je veux être dans le @author après toi
Tiens au passage, si tu utilise PHPUnit, voilà ma classe de tests: Code :
Une autre amélioration possible serait de retourner la référence et pas l'objet pour gagner en performances mais ce n'est pas possible avec __callStatic visiblement (j'ai écrit une note là dessus après avoir fait des tests: http://php.net/manual/en/language.references.return.php). Une idée ?
__________________
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
|
|
|
#4 | |
![]() ![]() Inscription : septembre 2010 Messages : 7 101 ![]() |
Citation:
je mettrai tout les docbooks plus tard
__________________
http://blog.stealth35.com/ |
|
|
|
00
|
|
|
#5 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Pour le pb de la référence tu as une idée ?
__________________
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
|
|
|
#6 |
![]() ![]() Inscription : septembre 2010 Messages : 7 101 ![]() |
en php 5 tout objet est passer en référence
EDIT : t'es sur du : class_exists($name, static::$_autoload) ton static::$_autoload est true ou false non ?
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#7 | ||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
En effet:
Code :
C'est unit testé et ça fonctionne. Le paramètre booléen sert à utiliser ou non l'autoloader dans class_exists.
__________________
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 | |||||
![]() ![]() Inscription : septembre 2010 Messages : 7 101 ![]() |
Citation:
sinon avec spl_autoload_register ca marche bien aussi Code :
Code :
__________________
http://blog.stealth35.com/ |
|||||
|
|
00
|
|
|
#9 | ||
![]() ![]() Inscription : septembre 2010 Messages : 7 101 ![]() |
visiblement y'a un bug... :
Code :
__________________
http://blog.stealth35.com/ |
||
|
|
00
|
|
|
#10 | ||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
C'est un bug connu il me semble.
Personnellement je dis non aux alias de classes et de namespaces: Eclipse n'arrive pas à faire d'auto complétion dessus donc l'avantage de typographie est nul. Citation:
Citation:
On est pas trop mal avec ça L'amélioration future devra supporter un mécanisme de persistence avec les patterns Strategy et Adapter et là ce serait gé-nial. Maintenant, ta classe m'a donnée une idée pour faire une identity map sur le même principe... C'est globalement le même fonctionnement mais avec plusieurs instances disponibles d'une même classe, différenciés par leurs RTTI.
__________________
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
|
|
|
#11 | |
![]() ![]() Inscription : septembre 2010 Messages : 7 101 ![]() |
visiblement non, d'ailleurs j'ai eu le droit a un jolie "bogus" et basta...
Citation:
EDIT : n'hésite pas à faire un fork sur github
__________________
http://blog.stealth35.com/ |
|
|
|
00
|
|
|
#12 | |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Citation:
Ce que je ne comprends pas, c'est que SplObjectStorage autorise la création d'infos en regard de chaque objet inséré mais ne permet pas de retrouver ces objets à partir de ces informations. En d'autres termes, les objets sont les clés et les infos sont les valeurs, c'est assez confus pour moi... En revanche c'est un bon candidat quand il s'agit de trouver une structure pour jeter des objets sans se soucier de pouvoir les récupérer par index comme avec le pattern Observer par exemple ou le dispatch se fait sur tous les objets de la collection d'observés. Tu as déjà expérimenté le fait de lui coller un iterateur par dessus pour lui donner une "forme" ?
__________________
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
|
|
|
#13 |
![]() ![]() Inscription : septembre 2010 Messages : 7 101 ![]() |
non mais tu peux y accéder comme un array avec les []
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#14 | |||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Citation:
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
|
|
|
#15 |
![]() ![]() Inscription : septembre 2010 Messages : 7 101 ![]() |
ouai c'est dommage
__________________
http://blog.stealth35.com/ |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com