Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/12/2010, 16h08   #1
Futur Membre du Club
 
Inscription : décembre 2003
Messages : 86
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 86
Points : 17
Points : 17
Par défaut abstraction d'accès une base de donnée

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 :
Code :
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 />';
	}
}
le truc c'est que ça ne fonctionne pas :
Code :
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>';
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.

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.
beyo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2010, 16h42   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 817
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 817
Points : 3 442
Points : 3 442
Il y a un exemple d'implémentation PHP ici : http://en.wikipedia.org/wiki/Multiton_pattern
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 20h16   #3
Membre Expert
 
Inscription : septembre 2010
Messages : 1 233
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 233
Points : 1 553
Points : 1 553
Voici un autre extrait de code qui pourrait t'aider ici:

Code :
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
class connect_bdd
{
        private static $instance = array();
 
        private function __construct($db_name)
        {
                require_once('fichier_des_donnees_de_connexion');
 
                // Permet de verifier que la base de donnees demandee existe
                if( !array_key_exists($db_name, $database) )
                        throw new Exception('[connect_bdd] given database name "'.$db_name.'" is not configured');
 
                mysql_select_db($database[$db_name], $connection);        
        }
 
        public static function getInstance($db_name)
        {
                // Si l'instance de connexion à la base de donnees n'existe pas, creation puis ajout à la liste des instances
                if( !array_key_exists($db_name, self::$instance) )
                {
                        self::$instance = new connect_bdd($dbname);
                }
 
                return self::$instance[$db_name];
        }        
}
 
connect_bdd::getInstance('db1');
connect_bdd::getInstance('db2');
connect_bdd::getInstance('db1');
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h56.


 
 
 
 
Partenaires

Hébergement Web