Установка параметра функции по умолчанию в конструкторе - PullRequest
1 голос
/ 19 августа 2011

Извините, но еще не знаком с OO.

Я работаю с CodeIgniter, но этот вопрос в основном просто PHP OO.

У меня есть файл класса с кучей функций, которые делают похожую вещь:

function blah_method($the_id=null)
{                   
        // if no the_id set, set it to user's default
        if(!isset($the_id)){
            $the_id = $this->member['the_id'];          
        } 

Теперь, вместо того, чтобы делать это с каждым методом в этом классе, могу ли я установить это в конструкторе? так что я все еще могу передать $ the_id явно, чтобы переопределить его, но в противном случае он всегда просто по умолчанию $this->member['the_id'];

Какой самый элегантный способ сделать это?

Ответы [ 3 ]

0 голосов
/ 19 августа 2011

Я думаю, что самый элегантный способ - расширить класс arrayobject и переопределить метод смещения, который вызывается, если вы пытаетесь получить доступ к свойству, которое не установлено. Тогда вы можете просто вернуть или установить то, что вам нужно, и забыть конструкцию.

0 голосов
/ 19 августа 2011

вы можете сделать это:

class A {

    private $id = null;
    public function __construct($this_id=null){
        $this->id = $this_id;
    }

    public function _method1(){
        echo 'Method 1 says: ' . $this->id . '<br/>';
        return "M1";
    }

    public function _method2($param){
        echo 'Method 2 got param '.$param.', and says: ' . $this->id . '<br/>';
        return "M2";
    }
    public function __call($name, $args){
        if (count($args) > 0) {
            $this->id = $args[0];
            array_shift($args);
        }
        return (count($args) > 0)
            ? call_user_func_array(array($this, '_'.$name), $args)
            : call_user_func(array($this, '_'.$name));
    }
}

$a = new A(1);
echo $a->method1() . '<br>';
echo $a->method2(2,5) . '<br>';

конечно, это уродливо и вызовет некоторую путаницу, если у вас есть дополнительные необязательные переменные в функциях ...

кстати, вывод:

Method 1 says: 1
M1
Method 2 got param 5, and says: 2
M2
0 голосов
/ 19 августа 2011

Как насчет передачи всех ваших инициализирующих данных в конструктор в виде массива?

public function __construct(array $settings) {

    // if 'the_id' has not been passed default to class property.
    $the_id = isset($settings['the_id']) ? $settings['the_id'] : $this->member['the_id']; 
    // etc
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...