PHP, create_function ou l’évaluer au moment de l’exécution?
-
06-07-2019 - |
Question
J'ai une classe avec une méthode qui dépend d'un paramètre. Quelle est la meilleure façon d’écrire cette méthode?
Exemple:
Première voie
class Test{
var $code;
function Test($type){
if($type=="A"){
$this->code=create_function(/*some args and some code*/);
}
else if($type=="B"){
$this->code=create_function(/*some args and some code*/);
}
}
function use(/*some args*/){
return call_user_func($this->code,/*some args*/);
}
}
Deuxième voie
class Test{
var $type;
function Test($type){
$this->type=$type;
}
function use(/*some args*/){
if($this->type=="A"){
//some code
}
else if($this->type=="B"){
//some code
}
}
}
$test=new Test("A");
$test->use();
Quelle voie choisiriez-vous?
La solution
ni (sauf si vous expliquez plus clairement ce que vous recherchez). en général, les objets spécialisés sont considérés comme meilleurs que la création de branches.
class Test {
abstract function useIt();
}
class TestA extends Test {
function useIt() { code for A }
}
class TestB extends Test {
function useIt() { code for B }
}
Autres conseils
Je choisirais la deuxième façon, pour commencer: call_user_func est une fonction lourde (et il est préférable de l'utiliser autrement) et ce code ne serait strictement pas orienté objet, alors que la seconde le serait.
Merci pour vos réponses.
J'ai réfléchi à cela car je construisais une classe pour l'interaction avec les bases de données. Donc, il serait bien que nous puissions faire ceci:
$db=new DB(/* host, user etc*/, "mysql");
or
$db=new DB(/* host, user etc*/, "mysqli");
Mais oui, le meilleur moyen est l'héritage et OO, je peux en faire comme ceci:
$db=new MysqlDB(/* host, user etc*/);
or
$db=new MysqliDB(/* host, user etc*/);
Merci encore.