Bon, déjà, je tends le bâton pour me faire frapper : je débute en POO et j'avoue que même si j'en vois l'intérêt, j'ai du mal à mettre en pratique.
Mon but est de pouvoir avoir des classes qui me permettent de me connecter à une base, voire plusieurs base (mysql, mais ça pourrait changer) en même temps. J'ai donc lu de la "littérature" sur le multiton, qui me parait un bon candidat.
voilà où j'en suis :
le truc c'est que ça ne fonctionne pas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 /**Interface Multiton*/ abstract class ModInterface { public static $_instance = array(); public static function getInstance($name, $args = array()) { if ( !isset(self::$_instance[$name]) ) { if ( class_exists($name) ) { // Création des arguments pour le constructeur de classe $arglist = array(); for ($i = 0, $n = count($args); $i < $n; $i++) { $arglist[] = '$args['.$i.']'; } $arglist = implode(',', $arglist); // Création d'une fonction temporaire pour l'instanciation de la classe $new_class = create_function('$name, $args', 'return new $name('.$arglist.');'); define(strtoupper($name), NULL); self::$_instance[$name] = $new_class($name, $args); } } return self::$_instance[$name]; } } /**Classe générique de connection*/ class Database { private $server = ''; //nom du serveur private $user = ''; //login private $pass = ''; //password private $database = ''; //nom de la base public function __construct($server=null, $user=null, $pass=null, $database=null) { // error catching if not passed in if ($server==null || $user==null || $database==null) { die('Les information de connection à la base doivent être passées lors de la création de l\'objet'); } $this->server = $server; $this->user = $user; $this->pass = $pass; $this->database = $database; } } class mysql extends Database { public function foo() { echo $this->user.':'.$this->pass.'@'.$this->server.' '.$this->database.'<br />'; } }
j'obtiens bien le même object(mysql)#1, mais les paramètres ne sont pas pris en compte : c'est 'db1' qui est affiché 3 fois. Or je voudrais un object(mysql)#2 dans le cas de $mysql2.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 $server = '127.0.0.1'; $user = 'root'; $pass = ''; $database = 'db1'; $database2 = 'db2'; $mysql0 = ModInterface::GetInstance('mysql', array($server, $user, $pass, $database)); echo '<pre>';var_dump($mysql0);echo '</pre>'; $mysql1 = ModInterface::GetInstance('mysql', array($server, $user, $pass, $database)); echo '<pre>';var_dump($mysql0);echo '</pre>'; $mysql2 = ModInterface::GetInstance('mysql', array($server, $user, $pass, $database2)); echo '<pre>';var_dump($mysql2);echo '</pre>';
Je n'arrive pas à comprendre comment utiliser le principe d'utilisation des arguments dans ce cas, pour avoir 2 instances différentes, si les arguments sont différents.
Merci d'avance de me dire ce qui cloche.
Partager