Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

nom de classe variable

4 réponses
Avatar
Paul
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.

4 réponses

Avatar
Tonio
'lut !

QQc du genre :

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

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

devrais faire l'affaire.

Tonio
Avatar
Tonio
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!');
}
Avatar
Paul
> $foo = new $config['use_classe'];



ca fonctionne très bien tout simplement ; j'étais persuadé que ca
n'allait pas marcher...
merci !
Avatar
slambert
"Paul" wrote
Pour être plus précis :
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