Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : [POO] Singleton ou référence ? [ POO / Autre ] (zeguizmo)

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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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é 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 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 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 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


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,20 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.