Accueil > Forum > > > > [POO] Singleton ou référence ?
[POO] Singleton ou référence ?
mardi 6 mai 2008 à 18:05:25 |
[POO] Singleton ou référence ?

zeguizmo
|
Salut à tous ! Je me pose actuellement une question, concernant les objets transversaux tels que l'objet gérant la base de données, classes de log etc ... Comment passer ces objets aux autres objets de mon appli ? Par référence ou en utilisant le pattern design singleton ? Par exemple, pour un objet user, faut-il créer une variable membre et passer par référence l'objet gérant la BDD lors de l'instanciation du user ? (accessible donc par $this->db a chaque fois que l'on veut envoyer une requête dans l'objet user).La classe de BDD serait donc instanciée une fois et passée par référence a chaque fois. OU Faut-il a chaque fois que l'on veut passer des requêtes dans une méthode la classe user commencer par instancier la classe gérant la BDD en utilisant un pattern design singleton ? (du type : $db = MySQL::singleton($params) ) La classe de BDD serait donc instanciée (singleton) dans chaque méthode de chaque objet qui a besoin de passer des requêtes. Ou alors c'est strictement la même chose ? En terme d'écriture, personnellement je préférerai utiliser l'instanciation de singleton a chaque fois, c'est pour ça qu'existe ce type d'instanciation je pense. Par contre en terme de performance je ne sais pas ce que ca donne, si beaucoup de méthodes s'enchainent, je ne sais pas comment est gérée l'instanciation par singleton, si c'est aussi rapide d'accès qu'un travail sur la référence. Peut etre encore je suis complètement dans le faux, et qu'il ne faut pas procéder de la sorte, j'écoute vos conseils avisés. Merci beaucoup et bonne fin de journée ZeGuizmo
|
|
mardi 6 mai 2008 à 18:59:05 |
Re : [POO] Singleton ou référence ?

zeguizmo
|
Avec la fonction recherche j'ai raté ce post, qui figure quelques lignes en dessous du mien :
http://www.phpcs.com/infomsg_GESTION-USER_1115107.aspx#4
Ici neige d'hiver propose d'instancier par singleton puis de le passer dans une variable $user->db Est-ce meilleur que de passer une reference vers l'objet de base de données au constructeur du user ?
J'imagine que c'est meilleur que d'instancier par singleton a chaque méthode, mais je n'en suis pas certain.
Car il y a un problème pratique, je trouve, a créer une variable membre 'db' pour chaque objet qui necessite une connection, c'est le debug. Quand on fait un joli print_r de notre objet user pour voir un peu quelle connerie on a pu faire pour qu'il s'appelle alfred au lieu de marcel, et qu'on utilise des objets debase de données un poil conséquents (type MDB2 de pear) ben le print_r prend des dizaines de pages. Quand il y en a qu'un, ca va, mais quand on travaille sur une liste de quelques dizaines de user, imagnez un peu les dégats.
Donc je reformule ma question, après tout ça :
En terme d'éthique et de performance, puis-je sérieusement instancier un objet qui peut être assez important (type gestion de base de données) par singleton à chaque méthode qui en a besoin, ou cela ne se fait pas et on préférera utiliser une variable membre de l'objet contenant la base de données. Si la deuxieme solution est la bonne, est-il mieux de passer l'objet par référence au constructeur de classe, ou vaut-il mieux l'instancier dans le constructeur de classe en singleton ?
Merci, et désolé si je ne suis pas tres clair.
ZeGuizmo
|
|
mardi 6 mai 2008 à 19:40:00 |
Re : [POO] Singleton ou référence ?

malalam
|
Réponse acceptée !
Hello,
rien ne t'empêche de mixer les deux : dans le constructeur de la classe utilisatrices, tu récupères ton singleton et tu le stockes dans une propriété de ta classe. Ainsi, ce sera toujours la même instance. Et cela t'évitera de te planter si jamais tu passes explicitement une instance de ta classe DB à ta classe utilisatrice en tant que paramètre de son constructeur, en l'instanciant à plusieurs endroits dans ton code. Ceci dit...: class A { private $db;
public function __construct(db $db) { $this->db = $db; } }
class db { public static function getInstance(bla) { // bla bla } }
$db = db::getInstance(bla); $a = new A($db);
OU class A { private $db;
public function __construct() { $this->db = db::getInstance(bla); } }
sont strictement identiques. Pourquoi ? Parce que les objets passés en paramètres d'une méthode sont, en PHP5, TOUJOURS des références. Dans le 1er cas, tu ne dupliques donc pas ton objet. Dans le second non plus...mais le second est plus simple à mon sens. Et que ce soit dans le 1er ou dans le second, dans tous les cas, tu utilises le même objet même dans plusieurs classes.
Ce que tu évoques comme risque ne se présente que dans un cas :
class db { public function __construct() {
} }
$a = new A(new db()); $b = new B(new db()); Là, tu auras deux copies de db, en effet. Mais si tu fais : $db = new db(); $a = new A($db); $b = new B($db); tu n''auras qu'un seul objet. Le risque est faible, en clair...
|
|
mercredi 7 mai 2008 à 16:53:56 |
Re : [POO] Singleton ou référence ?

zeguizmo
|
Salut !
Merci de ta réponse très claire et détaillée, cela confirme ce que j'avais compris.
En revanche il me reste une interrogation.
Dans un objet, quand on déclare une variable membre assez lourde (genre db ..) et qu'on fait du print_r à la chaine pour debugger, cela devient très illisible. (quand on manipule une liste d'objets user par exemple, on se retrouve avec 10 fois l'objet db de printé, on ne retrouve plus rien à l'écran)
Je voudrais supprimer l'emploi d'une variable membre contenant la db (ou classe de log, ou classe de formulaire...) pour justement ne garder que les informations sémantiquement liées à l'objet.
Est ce que cela nuirait significativement aux performances et à la qualité du code si je déclare dans chaque méthode les objets dont j'ai besoin en singleton, au lieu d'utiliser une variable membre de l'objet que je manipule ?
Merci beaucoup et bonne fin d'après midi ! (et bon week end pour les chanceux qui font le pont)
ZeGuizmo
|
|
mercredi 7 mai 2008 à 19:33:54 |
Re : [POO] Singleton ou référence ?

malalam
|
Réponse acceptée !
Oui, la perte serait probablement significative si tu as bcp d'appels à ces méthodes. Tout est une question d'équilibre. Si tu n'appelles qu'une fois une méthode dans un script, et que seule cette méthode a besoin d'un objet précis, alors pourqui pas, par contre.
|
|
jeudi 8 mai 2008 à 00:11:40 |
Re : [POO] Singleton ou référence ?

zeguizmo
|
Ok, je vais opter pour la méthode mixte que tu décris, je trouverai une solution pour le debug :)
Merci encore !
ZeGuizmo
|
|
jeudi 8 mai 2008 à 00:27:23 |
Re : [POO] Singleton ou référence ?

garfield90
|
Réponse acceptée !
tu peux aussi regarder du coté de __toString(),
class user{ private $nom; private $prenom private $db;
function __toString(){ return '<pre>'.$this->prenom."\n".$this->nom.'</pre>' } }
normalement, si tu fais $oUser = new user('toto', 'titi'); print_r($oUser); => <pre>toto\ntiti</pre>
"They are 10 sorts of persons whose understand binary and whose not"
|
|
jeudi 8 mai 2008 à 12:44:54 |
Re : [POO] Singleton ou référence ?

malalam
|
Ou ArrayObject, mais c'est un peu plus compliqué.
|
|
lundi 12 mai 2008 à 21:14:50 |
Re : [POO] Singleton ou référence ?

zeguizmo
|
Oh oui merci pour la méthode toString, je ne savais pas qu'elle existait pour tous les objets !
Ca fonctionne à merveille :)
Je n'ai pas encore regardé ArrayObject, ce n'est pas nécessaire car toString suffit, mais par contre je vais y jeter un coup d'oeil, autant mettre le plus d'outils possible dans ma besace.
ZeGuizmo
|
|
Cette discussion est classée dans : objet, référence, user, passer, singleton
Répondre à ce message
Sujets en rapport avec ce message
pb foreach avec classe ( prog objet ) [ par fredericmaill ]
Bonjour j'ai un probleme pour metre a jour mon objet afin de faire un update dur ma table avec des données recupéré d'un formulaire en methode post.(
session avec objet [ par Rhazou ]
Bonjour,Je me tourne vers vous car je suis face a un pb que je n'arrive pas a résoudre.Je reg un objet dans une session, par d'erreur. si j'essay de l
securité [ par pssinjaune ]
Bonjour,je suis en train de cree, mon site web.Il y a une partie privé à laquelle l'utilisateur doit s'identifier s'il veut y acceder.J'ai mis des sec
Comment convertir un objet en un autre objet. [ par Rapace ]
Bonjour à tous,Voici ma question, j'aimerai convertir un objet en un autre objet. Est-ce possible et si oui comment ?Par exemple j'ai dans une db les
Passer une cellule en référence [ par Evangun ]
Bonjour à tous,désolé de poser ici une question javascript, mais le forum javascriptfr est vraiment trop mort et j'ai l'impression qu'ils ne répondron
Référence dans formulaire [ par mheditions ]
bonjour.tjs dans le but d'améliorer un formulaire de commande, je cherche à partir d'une page html qui contient plusieurs objet à commander ; que chac
Instanciation d'une classe [ par aquouel ]
Bonjour tout le monde,j'ai une question à propos de l'instanciation de classe. Immaginons que j'ai une classe "User" qui possède des propriètés propre
passage d'objet [ par kyript ]
Bonjour à tousvoila je cherche la méthod pour passer un objet d'une classeà une autre sans passer par extends car j'ai plusieurs class à integrerdans
sessions et objet [ par ov3rdoze ]
Salut Je voudrai faire un systeme de panier. j'ai fais le code suivant : class Panier { var $panier = array(); // constructeur function __c
redemarrer service [ par eryk17 ]
Bonjour,Est ce que quelqu'un sait comment redemarrer le service TOMCAT en ligne de commande avec les droit root pour un utilisateur normal.En fait j'a
Livres en rapport
|
Derniers Blogs
GESTION D'EXCEPTION AVEC LES TASKSGESTION D'EXCEPTION AVEC LES TASKS par richardc
Nous avons vu dans un précédent article comment utiliser Task pour effectuer des opérations dans un autre thread.
Malheureusement, comme tout le monde n'est pas parfait, il se peut que cette exécution se passe mal et qu'une exception se produise.
La...
Cliquez pour lire la suite de l'article par richardc DéMARRONS AVEC LES TASKSDéMARRONS AVEC LES TASKS par richardc
Que vous le vouliez ou non, le développement multi-tâche est maintenant une obligation pour toute nouvelle application. Il est donc vital d'en comprendre les mécanismes et de s'y mettre le plus tôt possible.
En attendant le .NET Framework 4.5 avec le...
Cliquez pour lire la suite de l'article par richardc SLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPSSLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPS par Vko
Retrouvez les slides et les démo de ma session Fast & Furious XAML Apps. A ceux qui se posent la question : "est-ce que le code de la DataGrid est disponible?", je vous répondrais "pas encore". Je vais mettre en place un projet codeplex pour part...
Cliquez pour lire la suite de l'article par Vko XNA IS DEAD!XNA IS DEAD! par richardc
Depuis la semaine dernière (et grâce aux TechDays 2012), je me penche activement sur la nouvelle version de Windows, aka Windows 8. Vous me direz, il était temps puisque la première preview date de Septembre dernier.
OK. Remarquez, on n'en est qu'aux...
Cliquez pour lire la suite de l'article par richardc TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 !TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 ! par ROMELARD Fabrice
Speakers: Fabrice Meillon et Stanislas Quastana Cette session est basée entièrement sur celle donnée lors de la BUILD cet hiver. Il n'y a pas d'ajout d'information en rapport avec cet évènement passé. Windows 8 Server sera intégralem...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
CHAMPS TIMECHAMPS TIME par vargas
Cliquez pour lire la suite par vargas
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|