il faut que tu revois la portée des variables
si dans ton script tu a
<?php
$bdd = ' ..'; // cette variable est globale au script, donc utilisable partout dans le script
// sauf dans des fonctions / classe qui sont "étanches" à ce qu'il y a autour ;)
function truc() {
$bdd = 'machin'; // une autre variable totalement différente de la $bdd du dessus
}
function chose () {
global $bdd; // on indique que l'on va utiliser une variable qui s'appelle $bdd et qui est globale au script
// on utilise donc la variable définie au début
}
?>
Pour ce qui est du singleton, en gros, c'est l'art de rendre le constructeur de la classe privé et que donc on ne peux l'instancier par un $var = new maclasse();
on va aussi lui ajouter une méthode, dite statique qui va permettre de récupérer une instance de l'objet
par exemple
<?php
class spdo {
private static $pdoInstances = array(); // les différents instance en fonction du dsn
private function __construct() {
;
}
public static function getInstance($dsn, $user,$passwd){
if (!isset(self::$pdoInstances[$dsn])){
try {
self::$pdoInstances[$dsn] = new PDO($dsn, $user, $passwd);
}
catch (PDOException $e) {
throw new Exception($e->getMessage(),$e->getCode(),$e->getPrevious());
}
}
return self::$pdoInstances[$dsn];
}
}
?>
cette classe ne peux pas être appelé avec classique $v = new $spdo();
on va faire
$pdo = spdo::getInstance(dsn,$user,$passwd);
et la $pdo va contenir une instance de la classe PDO.
Le truc c'est que si tu fait cela plusieurs fois dans ton script (donc plusieurs getinstance) tu n'aura pas plusieurs instance de la classe mais toujours la même et donc pas plusieurs connexion à ton sgbd.
cette est classe est multiton pas un singleton. La différence ? c'est qu'avec un singleton je ne peux avoir qu'une seul instance de la classe, quelque soit les paramètres.
la j'ai la possibilité d'avoir plusieurs instance de la classe pour des "dsn" différents. donc la en gros pour des connexion différente, par exemple une connexion à mysql, une à un serveur oracle, une à un serveur msql etc etc.
ceci ne pourrait être possible avec un singleton.
comment ça marche ?
<?php
class spdo {
// un tableau "privé qui va contenir les différentes instance de la classe
private static $pdoInstances = array();
// on définit le constructeur comme privé donc pas new spdo() possible
private function __construct() {
;
}
// cette méthode est sstatique on ne pourra l'utiliser que comme ceci : spdo::getInstance()
public static function getInstance($dsn, $user,$passwd){
if (!isset(self::$pdoInstances[$dsn])){// si dans $pdoInstances je n'ai pas déja un index qui correspond à $dsn
// on créer une instance de pdo que l'on met dans $pdoInstances[$dsn]
try {
self::$pdoInstances[$dsn] = new PDO($dsn, $user, $passwd);
}
catch (PDOException $e) {
throw new Exception($e->getMessage(),$e->getCode(),$e->getPrevious());
}
}
// on retourne l'instance
return self::$pdoInstances[$dsn];
}
}
?>
des explications
ici surement plus claire.
il y a aussi d'autres patrons de conceptions
bonne lecture
@+