Могу ли я установить аргумент метода по умолчанию со свойством класса в PHP? - PullRequest
15 голосов
/ 29 сентября 2010

Я использую PHP 5.2.6.Я хочу иметь значение по умолчанию для аргумента в методе, но мне кажется, что он становится слишком умным.

Свойство класса blnOverwrite по умолчанию установлено в другом месте класса.У меня есть метод, в котором я хочу снова установить его, но не переопределять существующее значение.Я получаю сообщение об ошибке:

public function place( $path, $overwrite = $this->blnOverwrite ) { ... }

Должен ли я сделать что-то подобное?

public function place( $path, $overwrite = NULL ) { 
    if ( ! is_null($overwrite) ) {
        $this->blnOverwrite = $overwrite;
    }
    ...
}

Ответы [ 4 ]

12 голосов
/ 29 сентября 2010

Да, вы должны сделать это таким образом. Вы не можете использовать значение члена для значения аргумента по умолчанию.

Из руководства по PHP по аргументам функций: ( выделение мое )

Функция может определять значения по умолчанию в стиле C ++ для скалярных аргументов. […] PHP также позволяет использовать массивы и специальный тип NULL в качестве значений по умолчанию. […] Значением по умолчанию должно быть константное выражение, а не (например) переменная, член класса или вызов функции. […] Обратите внимание, что при использовании аргументов по умолчанию любые значения по умолчанию должны быть на правая сторона любых не стандартных аргументов; в противном случае все будет работать не так, как ожидалось.

10 голосов
/ 15 марта 2012

Вы абсолютно можете это сделать. Лучшее из обоих миров: инициализируйте ваше свойство по умолчанию И аргумент по умолчанию вашего метода с константой класса.

class Object {

    const DEFAULT_BLNOVERWRITE = TRUE;

    protected $blnOverwrite = self::DEFAULT_BLNOVERWRITE;

    public function place($path, $overwrite = self::DEFAULT_BLNOVERWRITE) {
        var_dump($overwrite);
    }
}

$Object = new Object();
$Object->place('/'); //bool(true)
3 голосов
/ 29 сентября 2010

Вы должны сделать это таким образом, afaik, или использовать константу класса, начиная с php 5.3, но, конечно, она будет исправлена ​​и не может быть изменена позже, поэтому я определенно выбрал бы ваше собственное решение:

class foo{
    const constant = 'bar';

    public function place($path, $overwrite = self::constant ) { 
        die('bla' . $overwrite);
    }
}

$bar = new foo();
$bar->place('baz');
0 голосов
/ 29 сентября 2010

Вы можете просто немного его укоротить:

public function place( $path, $overwrite = NULL ) { 
    if(!is_null($overwrite))$this->blnOverwrite = $overwrite;
    ...
}

но это почти то же самое

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...