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