MS-DOS_1991 Posté 27 Mai 2006 Posté 27 Mai 2006 Bonjour à tous Je développe actuellement un Forum, et je planche sur un petit problème... J'ai une classe Forum: class Forum{ function __construct() { // blabla } // blabla} dans laquelle je voudrais utiliser une classe db qui gère ma base de données (connexion, requêtes, etc). Jusqu'ici, je créais un nouvel objet db dans mon constructeur: function __construct() { $this->DB = new DB(HOST, USER, PASS, BASE); } // blabla} mais je voudrais que l'instanciation de la classe db soit indépendante des autres classes, ce qui implique qu'elle soit faite en-dehors de la classe Forum. Mon problème est alors le suivant: comment faire passer la variable de ressource ( $db = new DB(...) ) dans ma classe Forum Je pense que l'équivalent de ce que je recherche est la gestion des pointeurs comme en C, mais je ne sais pas si PHP la gère... Merci d'avance pour vos réponses
Xethorn Posté 28 Mai 2006 Posté 28 Mai 2006 Je ne comprends pas. Pourquoi ne pas appeler la classe db à partir de la page principale ? Ou alors, utiliser des variables d'environnements qui peuvent passer de classe en classe sans problème (du genre : $_GET, mais ne pas mettre n'importe quelle information dedans). Pour ce qui est des pointeurs, php ne dispose pas d'équivalent.
petit-ourson Posté 28 Mai 2006 Posté 28 Mai 2006 Voilà un exemple avec comme exemple une ressource d'un fichier. class MonFichier { var $vRessource; var $vNom; function MonFichier( $nomfichier ) { $this->vRessource = null; $this->vNom = $nomfichier; } function setRessource( $ressource ) { $this->vRessource = $ressource; } function Lire() { $contents = fread ($this->vRessource, filesize ($this->vNom)); echo $contents; }}$filename = "test.txt";$handle = fopen ($filename, "r");$vMonFichier = new MonFichier($filename);$vMonFichier->setRessource( $handle );$vMonFichier->Lire();fclose ($handle); Enfin il me semble également qu'il y a des différences entre php4 et php5
MS-DOS_1991 Posté 28 Mai 2006 Auteur Posté 28 Mai 2006 Merci, je vais regarder ça :a_thumbsup_20: Je ne veux en fait qu'une seule instance de la classe db (donc une seule connexion au SGBD) qui soit accessible dans toutes mes classes
petit-ourson Posté 28 Mai 2006 Posté 28 Mai 2006 Oui il faut mettre un place "un setter" comme mon setRessource ou passer ton instance de ta classe db lors de la construction de ton objet. Après il suffit de vérifier que ce n'est pas une copie qui est affectée au membre de ta classe, ce qui (apparemment) n'est pas le cas avec les ressources (en tout cas dans mon exemple).
MS-DOS_1991 Posté 28 Mai 2006 Auteur Posté 28 Mai 2006 Après il suffit de vérifier que ce n'est pas une copie qui est affectée au membre de ta classe, ce qui (apparemment) n'est pas le cas avec les ressources (en tout cas dans mon exemple). Oui, car je ne veux surtout pas que ma classe db soit copiée (d'où ma question sur les pointeurs) J'ai justement vu à plusieurs reprises ce genre de choses: function xxxxxx (&variable) A quoi sert le & ? Ne serait-ce pas là une sorte de pointeur vers une ressource justement ?
petit-ourson Posté 28 Mai 2006 Posté 28 Mai 2006 http://fr3.php.net/manual/fr/language.references.php oui effectivement si tu utilises un objet qui contient ta ressource, tu devras passer ton objet par reférence. Donc ma méthode setRessource deviendra quelques choses comme : function setRessource( &$objetressource ) { $this->vRessource = &$objetressource; }
MS-DOS_1991 Posté 28 Mai 2006 Auteur Posté 28 Mai 2006 Merci beaucoup c'est exactement ce que je voulais savoir
xorax Posté 29 Mai 2006 Posté 29 Mai 2006 moi je verrai plutôt un singleton : nexen singleton qwix.media-box.net d'ailleur ils expliquent précisément que c'est pour faire ça de plus je peux me trompé mais il me semble que le passage par référence (&) d'une classe n'existe pas, php fait une copie non ?
Dan Posté 29 Mai 2006 Posté 29 Mai 2006 de plus je peux me trompé mais il me semble que le passage par référence (&) d'une classe n'existe pas, php fait une copie non ? Depuis Php5, les objets sont toujours passés par référence, contrairement à Php4 qui les passait par valeur
petit-ourson Posté 29 Mai 2006 Posté 29 Mai 2006 moi je verrai plutôt un singleton :nexen singleton qwix.media-box.net d'ailleur ils expliquent précisément que c'est pour faire ça de plus je peux me trompé mais il me semble que le passage par référence (&) d'une classe n'existe pas, php fait une copie non ? Effectivement le singleton est pas mal si tu travailles sous PHP5.
Spidetra Posté 29 Mai 2006 Posté 29 Mai 2006 Effectivement le singleton est pas mal si tu travailles sous PHP5. Pourquoi php5 ? Il ne serait pas possible d'implémenter le Design Pattern Singleton en Php4 ?
petit-ourson Posté 29 Mai 2006 Posté 29 Mai 2006 Pourquoi php5 ?Il ne serait pas possible d'implémenter le Design Pattern Singleton en Php4 ? Si mais d'une façon moins élégante que les deux exemples proposés car il n'est pas possible de créer des membres statics en php4 (il me semble).
MS-DOS_1991 Posté 29 Mai 2006 Auteur Posté 29 Mai 2006 Pffffiou Cette discussion commence à me dépasser D'après un commentaire de l'article cité par xorax, Dans le cas particulier de mysql (et de la plupart des drivers de SGBD avec PHP), le singleton est inutile. Les fonctions de connexion gèrent déjà la mutualisation des connexions.Faire plusieurs appels identiques à mysql_connect() retourne le même identifiant de connexion à chaque fois. Pas besoin d'utiliser un singleton pour ça. Si c'est vérfié, cela me simplifierait énormément la tâche, puisque je n'aurais alors à m'occuper de rien Alors, SingleTons ou pas SingleTons ?
petit-ourson Posté 29 Mai 2006 Posté 29 Mai 2006 Moi j'en ferai un juste pour la forme Si demain tu changes de sgbd et que les fonctions de connexions ne gèrent pas la mutualisation des connexions, tu auras juste ta classe db à modifier ;o)
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant