Domanda

Ho una classe con alcuni metodi che dipendono da un parametro. Qual è il modo migliore per scrivere questo metodo?

Esempio:

Primo modo

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*/);
    }
}

Seconda via

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();

Quale modo sceglieresti?

È stato utile?

Soluzione

nessuno dei due (a meno che non spieghi più chiaramente cosa stai cercando). in genere, gli oggetti specializzati sono considerati migliori della ramificazione basata su proprietà.

class Test {
    abstract function useIt();
}

class TestA extends Test {
    function useIt() { code for A }
}

class TestB extends Test {
    function useIt() { code for B }
}

Altri suggerimenti

Vorrei scegliere il secondo modo, per cominciare: call_user_func è una funzione pesante (ed è meglio usata in altri modi) e quel codice non sarebbe strettamente orientato agli oggetti, mentre il secondo è.

Grazie per le risposte.

Ho pensato a questo perché sto costruendo una classe per l'interazione con il database. Quindi sarebbe bello poterlo fare:

$db=new DB(/* host, user etc*/, "mysql");
or
$db=new DB(/* host, user etc*/, "mysqli");

Ma sì, il modo migliore è l'ereditarietà e OO, posso fare un po 'così:

$db=new MysqlDB(/* host, user etc*/);
or
$db=new MysqliDB(/* host, user etc*/);

Grazie ancora.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top