Aller au contenu

[POO] transmettre une ressource à une classe


MS-DOS_1991

Sujets conseillés

Bonjour à tous :)

Je développe actuellement un Forum, et je planche sur un petit problème... :unsure:

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 :wacko:

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 :hypocrite:

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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).

Lien vers le commentaire
Partager sur d’autres sites

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 ? :unsure:

Lien vers le commentaire
Partager sur d’autres sites

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;
}

Lien vers le commentaire
Partager sur d’autres sites

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 ;)

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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).

Lien vers le commentaire
Partager sur d’autres sites

Pffffiou :whistling: Cette discussion commence à me dépasser :unsure:

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 :P

Alors, SingleTons ou pas SingleTons ? :blush:

Lien vers le commentaire
Partager sur d’autres sites

Moi j'en ferai un juste pour la forme :P

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)

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...