Могу ли я настроить аргумент метода по умолчанию с свойством класса в PHP?
Я использую 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;
}
...
}
Ответы
Ответ 1
Да, вы должны сделать это таким образом. Вы не можете использовать значение члена для значения аргумента по умолчанию.
Из руководства PHP по аргументам функции: (выделено мной)
Функция может определять значения по умолчанию в стиле C++ для скалярных аргументов. [...] PHP также позволяет использовать массивы и специальный тип NULL в качестве значений по умолчанию. [...] Значение по умолчанию должно быть константным выражением, а не (например) переменной, членом класса или вызовом функции. [...] Обратите внимание: при использовании аргументов по умолчанию любые значения по умолчанию должны быть включены правая сторона любых аргументов, отличных от дефолта; в противном случае все будет работать не так, как ожидалось.
Ответ 2
Вы абсолютно можете это сделать. Лучшее из обоих миров: инициализируйте свойство по умолчанию И ваш аргумент по умолчанию метода с константой класса.
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
Вы должны сделать это таким образом, 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');
Ответ 4
вы просто можете немного его сократить:
public function place( $path, $overwrite = NULL ) {
if(!is_null($overwrite))$this->blnOverwrite = $overwrite;
...
}
но это почти то же самое