Могу ли я настроить аргумент метода по умолчанию с свойством класса в 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; } ... } 

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

Из руководства 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; ... } 

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