POO - SINGLETON CLASS

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 - 8 janv. 2010 à 22:05
Waredan Messages postés 22 Date d'inscription vendredi 8 janvier 2010 Statut Membre Dernière intervention 19 février 2010 - 26 janv. 2010 à 12:38
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/51094-poo-singleton-class

Waredan Messages postés 22 Date d'inscription vendredi 8 janvier 2010 Statut Membre Dernière intervention 19 février 2010
26 janv. 2010 à 12:38
C'est exacte, une valeur équivalente à FALSE te fera passer dans la 2ème partie de la condition.

var_dump(false ?: true); // bool(true)
var_dump(null ?: true); // bool(true)
var_dump(0 ?: true); // bool(true)
var_dump('' ?: true); // bool(true)
abdoulax Messages postés 875 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 22 juin 2012 1
26 janv. 2010 à 11:07
Alors moi je vois un truc simple que j'attend depuis un moment dans PHP, c'est le ?:

Si j'ai bien compris
var_dump($test?:"yo"); // yo
$test = "lol";
var_dump($test?:"yo"); // lol
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
12 janv. 2010 à 00:59
Salut Sallmbaye,

Non, static, en PHP5.3 ne représente pas uniquement un mot clé désignant une méthode statique : il désigne aussi, grâce au LSB (Late State Binding, cf le lien donné par l'auteur de la source) la classe parente appelée de manière statique (dans une méthode statique). static, dans un contexte statique, est l'équivalent de parent dans un contexte objet.
Ce n'était pas possible avant, PHP5.3 apporte ici une réelle nouveauté : static permet de se référer à la classe parente via une méthode statique, ce qui n'était pas possible avant.

La différence est que new Singleton va tenter d'instancier la classe Singleton, qui est abstraite : en résultera une belle erreur fatale.
sallmbaye Messages postés 1 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 12 janvier 2010
12 janv. 2010 à 00:52
salut, ban je trouve votre solution assez simpliste mais vous devriez revoir ce syntaxe $instance = new static
dans
# final static public function getInstance()
# {
# static $instance = null;
# return $instance ?: $instance = new static;
# }

je pense que t'a voulu faire new Singleton
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
9 janv. 2010 à 12:25
Je reposte pour la note qui ne semble pas être passée ...
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
9 janv. 2010 à 12:22
Salut,

Ben c'est malin de pondre des sources comme celle ci :$, tu viens de ruiner ma journée et de mettre à la poubelle la class singleton que je m'étais arraché les cheveux à rendre un minimum potable (je ne suis pas expert) ... snif :o)

Rien à dire de plus que ce qui l'a déjà été, j'ai juste modifié à la va vite la méthode clone afin qu'elle lève une exception avec un message explicite.

Bravo !!

Cordialement,

Kohntark-
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
9 janv. 2010 à 11:40
LOL j'avais pas vu la visibilité de la méthode ^^
Hum. Bon. Mais est-ce qu'une exception avec un message d'erreur ne serait pas plus "propre" ? Bon, c'esdt du détail, hein, à ce niveau là ;)
Waredan Messages postés 22 Date d'inscription vendredi 8 janvier 2010 Statut Membre Dernière intervention 19 février 2010
9 janv. 2010 à 11:35
Oui, le clonage d'un objet à l'aide du mot clé "clone" fait appel à la méthode magique "__clone()" lorsqu'elle est définie dans une classe, ici, ayant une visibilité privée, une erreur fatale sera lancée.
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
8 janv. 2010 à 22:05
Salut,

Ca, ça me plaît. N'ayant pas encore PHP5.3 (les distribs Linux tardent à le mettre dans leurs packages et je n'ai pas le courage de l'installer à la main, idem pour FreeBSD), je n'ai pas encore eu le plaisir de développer cette classe... Mais tu l'as fait, et c'est très bien. Parce que c'est con, mais c'est juste pas possible à réaliser en PHP5.2 ... :/
Je ne m'y serais pas pris exactement de la même manière, mais je suppose qu'à l'utilisation, c'est rigoureusement identique.

Juste une interrogation sur ta méthode __clone() : je ne sais pas si, en l'état, elle empêche réellement le clonage (peut-être, je ne sais plus). Ne serait-il pas intéressant de lancer une exception pour l'empêcher réellement ? (je veux dire obliger le développeur à prendre ça en compte pour de vrai).
Rejoignez-nous