|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | |||
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2004 Messages : 26 ![]() |
Bonjour,
J'ai créée une classe singleton, qui me semble avoir un problème: à chaque fois que je transmet le formulaire l'instance est remise à zéro. Au lieu de récupérer une instance créée une fois pour toute, la classe singleton agit comme une classe qui ne l'est pas... ci-dessous mon code: Code :
l'affichage en sortie donne : Sgl:::Creation de l'instance n°(1) Sgl::Récupération de l'instance n°(1) Valeur de retour Citation:
Mes questions : - Comment faire pour avoir un comportement du singleton habituel (l'instance est créée une seule fois) ? - Comment éviter l'appel au destructeur ? Merci de vos réponses |
|||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() ![]() Inscription : janvier 2004 Messages : 1 238 ![]() |
Contrairement a un autre langage de programmation, les classes de PHP ne sont pas persistés en mémoire d'un appel d'une page a une autre.
Si c'était le cas, il serait difficile de savoir quand libérer la mémoire (si tu ferme brutalement ton navigateur, le site n'est pas au courant que la mémoire doit être libérée) Ta classe singleton n'est un singleton qu'au sein d'une seule requete HTTP d'un utilisateur. Si tu appelles plusieurs fois getInstance dans ton code php au sein d'une même requete HTTP alors tu récupèrera le même objet. => Si tu veux une donnée qui soit persistée de page en page pour UN utilisateur il faut que tu utilises soit un cookie, soit une session. => Si tu veux une donnée qui soit persistée de page en page pour TOUT les utilisateurs, il faut que tu utilise une base de donnée ou un fichier. Concernant le destructeur, il doit être appelé a la fin de la requete HTTP pour libérer la mémoire, et l'appel sort en erreur car il n'est pas public. Dans ton cas, laisse PHP gérer la mémoire, et sauf si tu en as réellement besoin, laisse tomber le destructeur.
__________________
PHP : Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production) Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error()); Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable. Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/ |
|
|
10
|
|
|
#3 |
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2004 Messages : 26 ![]() |
Merci pour ta réponse.
Si je stocke mon instance singleton dans une variable de session, Php va quand même faire un appel au destructeur à l'envoi du formulaire pour libérer la mémoire? Est-il possible de désactiver cet appel juste pour cette instance, et de gérer moi-même la vie de mon instance? |
|
|
00
|
|
|
#4 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2004 Messages : 1 238 ![]() |
Tu ne peux pas empêcher PHP de détruire ton instance (sauf peut être si tu utilises des trucs compliqués comme la mémoire partagée, mais a moins de savoir exactement ce que tu fait et d'avoir accès a la configuration de ton serveur, on oublie ^^)
En session tu ne peux pas stocker une instance, mais uniquement du texte. => Soit tu stockes directement la ou les données correspondant a ton singleton => Soit tu t'amuse a serialiser/deserialiser ton objet dans ta session Personnellement, tant que ton singleton est simple, je te conseille d'utiliser la session a la place. Et quand je dis "a la place", c'est pas "en plus". Bref, supprimer ton singleton et utiliser la session a la place. Ou alors, si tu veux utiliser les 2 (mais c'est inutile a mon avis), tu fait un "faux" singleton qui est mappé sur la session genre : Code :
__________________
PHP : Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production) Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error()); Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable. Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/ |
||
|
|
00
|
|
|
#5 |
![]() ![]() Thomas RambaudDéveloppeur Web Inscription : décembre 2007 Messages : 2 139 ![]() |
Bonjour,
Contrairement à ce qui est dit plus haut tu peux stocker ton objet en session. Penses-juste que si dans cette classe tu as des références vers d'autres objets elles seront perdues. Pour palier à çà il faut dans la méthode __sleep définir quelles membres tu gardent en session, et dans la méthode __wakeup revaloriser les membres. |
|
00
|
|
|
#6 | |
|
Membre Expert
![]() ![]() Inscription : janvier 2004 Messages : 1 238 ![]() |
Citation:
Par contre, la notion de singleton telle qu'on l'entend normalement, c'est a dire un objet UNIQUE, ne survivra pas si on le met en session. L'adresse de l'objet sera différente même si pour le développeur il a l'impression de manipuler le même objet.
__________________
PHP : Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production) Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error()); Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable. Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/ |
|
|
|
10
|
|
|
#7 |
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2004 Messages : 26 ![]() |
OK c'est déjà plus clair, merci pour vos réponses.
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com