PHP, create_function или оценить его во время выполнения? - PullRequest
1 голос
/ 23 октября 2009

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

Пример:

Первый путь

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

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

Ответы [ 3 ]

5 голосов
/ 23 октября 2009

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

class Test {
    abstract function useIt();
}

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

class TestB extends Test {
    function useIt() { code for B }
}
0 голосов
/ 23 октября 2009

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

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

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

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

0 голосов
/ 23 октября 2009

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

...