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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top