mageekblog - Mot-clé - singleton - CommentairesLe blog personnel de Frédéric Hardy. Au menu, PHP, agilité, FreeBSD, cuisine et photographies.2021-12-02T08:20:54+01:00Frédéric Hardyurn:md5:26874ca5b8cd4cac8d08b0e68e64f63aDotclearSingleton : ce qu'il ne faut pas faire ! - bouksurn:md5:90610d08aea87148d72ea41adc67d0a12013-03-12T23:57:55+01:002013-03-13T08:46:43+01:00bouks<p>Il est à mon avis bon de préciser que fermer la connexion n'a à priori aucun intérêt car php la ferme tout seul à la fin du script, et ce depuis pas mal de temps déjà.</p>
<p>Je ne sais plus sur quelle page mais c'est indiqué dans la doc php.</p>Une classe singleton en PHP 5.3+ - mageekguyurn:md5:4cf332b5ddfa20dd7e9e4856ba43cf792010-11-18T09:37:03+01:002010-11-18T09:37:43+01:00mageekguy<p>@<a href="http://blog.mageekbox.net/?post/2010/10/25/Une-classe-singleton-en-PHP-5.3#c2225" rel="nofollow">Mathieu</a> : Je t'assure que ça déconne, mais le problème provient de l'<code>eval()</code>, pas du LSB.</p>Une classe singleton en PHP 5.3+ - Mathieuurn:md5:17b6df5d525d6d2844f60f20543ca5442010-11-18T09:05:34+01:002010-11-18T09:36:47+01:00Mathieu<p>@metagoto : En fait ça ne "déconne" pas, car PHP se contente de respecter ses propres spécifications sur les variables statiques de fonction. En clair, $instance n'est pas locale à getInstance(), mais bien à a::getInstance() ou b::getInstance().</p>
<p>Je pense que PHP identifie les méthodes en tenant compte de l'espace de nom dans lequel elles sont appelées. Mais du coup il est "curieux" que le LSB ne fonctionne pas avant PHP 5.3. (Car notez que, si on remplace le mot clé static par un nom de classe passé en argument à getInstance, ce Singleton fonctionne parfaitement en PHP 5.0.)</p>Une classe singleton en PHP 5.3+ - Steufurn:md5:b803c2e107cec7faa896ea94df9ed31c2010-11-03T12:22:56+01:002010-11-03T12:23:36+01:00Steuf<p>@Stéphane Pour répondre à cette question, un exemple probable du besoin de surclasser __clone dans une classe dans un singleton est le cas suivant :</p>
<p>- Bien entendu une classe avec d'autres instances de classes dans les propriétés (sinon __clone n'a aucun intérêt évidemment)<br />
- Non pas avoir 1 unique instance de la classe dans le singleton, mais avoir plusieurs instances dans le singleton.</p>
<p>Dans ce cas de figure, nous n'avons pas 1 variables statiques avec une unique instance, mais une variable contenant un tableau d'instance. Il faut bien entendu que l'on ai envie de faire des clonages dans la méthode getInstance plutôt que des nouvelles instances de la classe.</p>
<p>J'avoue c'est un peu tordu, mais un cas probable. Je réserve le clonage aux collections d'objets pour ma part, bien plus rapide que de refaire 1 instance par ligne (qui instancie toutes les dépendances etc).</p>
<p>Sinon j'aime assez ce blog, je suis souvent en accord avec ce que dit l'auteur. Comme ici, nous avons "enfin" la possibilité de faire des résolution de portée avec "static".</p>Une classe singleton en PHP 5.3+ - mageekguyurn:md5:f31a1c986f3a2d0e92d7444b82a522a22010-10-26T11:55:37+02:002010-10-26T10:56:52+02:00mageekguy<p>@<a href="http://blog.mageekbox.net/?post/2010/10/25/Une-classe-singleton-en-PHP-5.3#c2182" rel="nofollow">Stéphane</a> : Avec ta solution, tu verrouille vraiment, même une classe dérivée ne peut pas se servir de __clone(), ce qui pourrait tout de même être intéressant dans certain cas (mais je n'ai pas d'exemples probant sur l'instant).</p>
<p>C'est un choix. </p>Une classe singleton en PHP 5.3+ - Stéphaneurn:md5:eef78fb17149a48545da2f8a9d50090a2010-10-26T10:50:17+02:002010-10-26T10:05:41+02:00Stéphane<p>Ce n'est pas tout à faire le sujet mais il y a-t-il un intérêt à mettre la méthode __clone() en "protected" ? Je l'aurai plutôt déclarée en "final private".</p>
<p>En tout cas c'est comme cela que j'écris mon Singleton ^^</p>Une classe singleton en PHP 5.3+ - metagotourn:md5:7fea698ce4d70d8e6a7123018c02c6ef2010-10-25T23:55:56+02:002010-10-26T05:51:57+02:00metagoto<p>Tu as raison, mageekguy, il y a un problème!</p>
<p> Je raisonnais comme si <code>$instance</code> était un membre statique (et pas statique dans la méthode, mais je pense que ça devrait être la même chose dans cet exemple).</p>
<p> Je viens de tester, quand c'est un membre statique, ça se comporte comme attendu, on n'obtient qu'un seul objet, que la classe b soit déclarée dans une condition ou non.</p>
<p>
Quand la variable est statique dans la fonction, ça <q>déconne</q> (comportement différent si on hérite de singleton ou a d'ailleurs).</p>
<p> Je reste prudent, on ne sait jamais (comprendre, c'est peut être une feature!).</p>Une classe singleton en PHP 5.3+ - mageekguyurn:md5:b792ffa753289e5ee25a1805cbc3315f2010-10-25T23:12:23+02:002010-10-25T22:20:54+02:00mageekguy<p>@<a href="http://blog.mageekbox.net/?post/2010/10/25/Une-classe-singleton-en-PHP-5.3#c2172" rel="nofollow">Jérémy</a> : voir mon commentaire à metagoto. Donc oui je t'arrête et te dis que tu te trompes :).</p>
<p>Vu que ça fait deux personnes qui ne captent pas la subtilité, j'ai édité le billet en conséquence.</p>Une classe singleton en PHP 5.3+ - Jérémyurn:md5:e0ce69709cdcc4553f5767a9075e1ef92010-10-25T23:08:49+02:002010-10-25T22:13:25+02:00Jérémy<p>Arrêtes moi si je me trompe, mais une variable static à une portée locale, ce qui signifie que dans ton exemple, elle est référencée au niveau de ta class "singleton" et que toutes les class qui dérivent de singleton partagent la même variable $instances. Il est donc "logique" que ton code échoue et que var_dump(b::getInstance()) retourne une instance de a.</p>Une classe singleton en PHP 5.3+ - mageekguyurn:md5:d89a3d8a2ce1c59b0062836ab05aa59a2010-10-25T23:00:02+02:002010-10-25T22:21:49+02:00mageekguy<p>@<a href="http://blog.mageekbox.net/?post/2010/10/25/Une-classe-singleton-en-PHP-5.3#c2170" rel="nofollow">metagoto</a> : Sauf que si tu défini la classe b <q>inline</q>, sans passer par eval() ou via une condition, et donc à la compilation et non au runtime, ça fonctionne parfaitement.</p>
<p>Alors, effectivement, suivant le point de vue, tu as raison et j'ai tort (et pour dire la vérité, je suis de ton avis, ma solution ne devrait pas marcher dans l'absolu, mais tout dépend de la façon dont PHP gère l'héritage), mais quelque soit le point de vue, dans l'absolu, je dirais <q>peu importe</q>, car le fonctionnement de PHP n'est pas cohérent.</p>
<p>Soit eval() ou n'importe quelle instruction qui déporte la définition de la classe au runtime génère le même comportement que si la classe dérivée était définie lors de la compilation, soit la classe dérivé définie à la compilation a le même comportement que lorsqu'elle est définie au runtime.</p>
<p>Mais pas un comportement dans un cas, et un différent dans l'autre.</p>Une classe singleton en PHP 5.3+ - metagotourn:md5:a2a7616c180ffec151be34dbda9c17232010-10-25T22:58:02+02:002010-10-25T21:59:54+02:00metagoto<p>Bug?<br />
Tu ne penses pas que le "bug" est dû au fait qu'il n'y a qu'une seule variable statique $instance dans la méthode statique getInstance... bref, la variable a un storage statique. Il n'y a qu'un seul storage pour toute la hiérarchie. Le premier a::getInstance() va assigner la variable une fois pour toute. Si ça fonctionnait comme tu l'imagines (le souhaites), là je pense qu'il y aurait effectivement un sérieux bug!<br />
Le comportement actuel me parait tout à fait normal :D</p>Singleton : ce qu'il ne faut pas faire ! - Julien Breuxurn:md5:4218bfca563ffd690ef577302b13ad832010-04-07T15:26:11+02:002010-04-07T14:34:58+02:00Julien Breux<p>Je suis super d'accord, je pense que si on appel ça des motifs de conception c'est qu'il y'a une problématique bien précise... et combien de Multi-Singleton on voit (ben ouai, on commence par un singleton (parce que ça fait joliment pro) et on finit par un fatroygleton-multiple :p)</p>
<p>J'aime beaucoup cette petite rubrique :p</p>Singleton : ce qu'il ne faut pas faire ! - mageekguyurn:md5:7bf04c40923bab3edfa1040c506c020c2009-12-28T11:37:55+01:002009-12-28T11:38:00+01:00mageekguy<p>@metagoto:</p>
<p>Absolument d'accord avec toi, l'utilisation du quatrième argument n'est effectivement nécéssaire que si on veut absolument garder le constructeur public, ce qui est complétement paradoxal dans le cas du singleton.</p>
<p>Ce n'est pas pour rien que le titre du billet contient "ce qu'il ne faut pas faire"...</p>Singleton : ce qu'il ne faut pas faire ! - metagotourn:md5:451740921965b2047d6e679c973b23fe2009-12-26T02:37:24+01:002009-12-28T11:35:46+01:00metagoto<p>Si on accepte (intellectuellement parlant) de recourir à un singleton pour gérer la connexion à la base de données, alors il me parait ridicule de vouloir utiliser mysql_connect() avec true en 4iem argument.</p>
<p>Par chance, j'ai comme l'impression que la singletonite aigüe qui a frappé la communauté php depuis 2005 est en train de s'estomper... C'est pas trop tôt!</p>Singleton : ce qu'il ne faut pas faire ! - Mickaëlurn:md5:8d075b8da28640ec0dde7936b7aac4792009-12-23T20:43:09+01:002009-12-28T11:36:11+01:00Mickaël<p>"Closed as this is not a bug"</p>
<p>^_^</p>