Вопрос

У меня есть класс с некоторым методом, который зависит от одного параметра.Как лучше всего написать этот метод?

Пример:

Первый способ

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

Второй способ

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

Какой путь вы бы выбрали?

Это было полезно?

Решение

ни (если вы не объясните более четко, что вам нужно).как правило, специализированные объекты считаются лучше, чем ветвление на основе свойств.

class Test {
    abstract function useIt();
}

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

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

Другие советы

Я бы для начала выбрал второй путь: call_user_func это тяжелая функция (и ее лучше всего использовать другими способами), и этот код будет строго не объектно-ориентированным, в отличие от второго способа.

Спасибо за ответы.

Я подумал об этом, потому что создаю класс для взаимодействия с базой данных.Так что было бы неплохо сделать это:

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

Но да, лучший способ - это наследование и объектно-ориентированный подход, я могу сделать что-то вроде этого:

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

Еще раз спасибо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top