Discussion:
nom de classe variable
(trop ancien pour répondre)
Paul
2009-03-06 07:53:03 UTC
Permalink
Bonjour,

Je ne sais pas comment faire et gérer ceci dans un script php :

J'ai une classe A, une classe B qui extends A, et une classe C qui
extends A.
B et C font strictement la même chose mais d'une manière différente
chacune.

J'ai un fichier de config dans lequel je souhaiet paramétrer soit
l'utilisation de la classe B soit la C.
J'aimerai ensuite, que mon script instancie la classe selon la config
(soit B, soit C) et ensuite, qu'il appelle la méthode (qui porte le
même nom dans la classe B que dans la classe C).

Mon probleme est que je veux éviter d'avoir un switch en fonction de
la classe ; j'aimerai en gros mettre le nom de la classe en variable,
mais je ne pense pas que ce soit possible.

donc :
$config['use_classe'] = "C";
switch($config['use_classe'])
/*c'est ce switch que j'aimerai rendre plus "général" ; si un jour je
souhaite ajouter une troisième classe possible (D) qui ferai encore la
même chose que B ou C */
{
case "B" : $foo = new B(); break;
case "C" : $foo = new C(); break;
}
$foo->bar();

Pour être plus précis :
A : un gestionnaire de base de données
B : gestionnaire mysql
C : gestionnaire sqlite
... ...

Quel est la bonne méthode à employer pour faire ça ?
merci.
Tonio
2009-03-06 09:08:50 UTC
Permalink
'lut !

QQc du genre :

abstract class A
{
abstract function bar();
}
(ou interface)

$foo = new $config['use_classe'];
$foo->bar();

devrais faire l'affaire.

Tonio
Tonio
2009-03-06 18:27:51 UTC
Permalink
allez, même un peu plus propre:

if (class_exists($config['use_classe']))
{
$foo = new $config['use_classe'];
$foo->bar();
}
else
{
throw new Exception('Class not found!');
}
Paul
2009-03-06 21:50:35 UTC
Permalink
Post by Tonio
$foo = new $config['use_classe'];
ca fonctionne très bien tout simplement ; j'étais persuadé que ca
n'allait pas marcher...
merci !
slambert
2009-03-18 22:17:24 UTC
Permalink
Post by Paul
A : un gestionnaire de base de données
B : gestionnaire mysql
C : gestionnaire sqlite
... ...
Et un petit Design Pattern, plus précisement Factory, dans le cas présent,
ca donnerait quoi ?

Stef

Loading...