Dernière question, après je pourrais mettre ce sujet en résolu..
Comment verriez-vous la chose , j'ai une classe de connexion MySql, et dans ma class User je devrais faire quelques requêtes..
Dois-je passer l'identifiant de ma classe au constructeur ?
Utiliser une variable global pour l'instance de ma classe Mysql ?
Re,
En ce qui concerne la connexion à la base de données, il peut être intéressant de :
1. pouvoir acccéder à la connexion à n'importe quel endroit de ton projet, sans avoir à se demander si la classe de connexion est accessible ou non à tel ou tel endroit du code
2. ne pas avoir à recréer une nouvelle connexion à chaque fois qu'il faut faire une requête SQL
Le premier objectif peut être atteint en utilisant une classe
statique. De cette façon, on ne passe jamais de classe de connexion en paramètre aux constructeur ou aux méthodes des objets : la connexion est accessible directement, à tout moment, de la façon suivante :
$connection =&Connection::getInstance();
Ici, getInstance est une méthode statique de la classe Connection et qui retourne une instance de connexion à la base de données.
Le 2eme objectif peut être atteint en faisant en sorte que la méthode getInstance() renvoit toujours la même connexion. Celle-ci n'est crée qu'une seule fois lors du premier appel à la méthode getInstance(), et réutilisée pour toutes les prochaines fois. Cela s'appele un Singleton en programmation. On peut l'écrire comme ceci :
class Connection{
/*membre utilisé pour stocker statiquement une instance de Connection.*/
private static $instance = null;
/*on voit ici la particularité du Singleton : le constructeur est privé! Cela signifie
que le dévelopeur ne peut pas créer lui même de nouvelle connexion : c'est de cette
façon que l'on garantit que ce sera toujours la même connexion qui sera utilisée partout*/
private function __construct(){
//mettre ici le code pour se connecter à la base de données
}
/*la seule méthode publique qui permet de récupérer une connexion.
Si aucune connexion n'a jamais été créée, $instance devient une nouvelle connexion,
sinon c'est la connexion qui a été créée auparavant qui est retournée*/
public static function &getInstance(){
if( self::$instance === null )
self::$instance = new Connection();
return self::$instance;
}
}
voilà, du coup dans la classe User, on peut accéder à la connexion unique sans avoir à la passer en paramètre au constructeur :
class User{
public function __construct( $iduser ){
//récupérer les données depuis la base
$query = "SELECT * FROM `users` WHERE iduser = '" . intval( $iduser ) . "' LIMIT 1";
$result = Connection::getInstance()->query( $query );
...
}
}
@+