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

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