Как установить аргумент метода по умолчанию для члена класса

У меня есть это внутри класса php:

$this->ID = $user_id;

public function getUserFiles($id = $this->ID) { } // error here

Но, видимо, мне не разрешено использовать собственность таким образом. Итак, как мне объявить, что значение аргумента метода по умолчанию должно быть значением свойства ID?

Должен быть лучший способ, чем этот:

$this->ID = $user_id;

public function getUserFiles($id = '') {
    $id = ($id == '') ? $this->ID : $id;
}

person JakeParis    schedule 10.02.2011    source источник
comment
Этот класс меня очень смущает. Если он имеет свойство одного идентификатора пользователя, то в идеале экземпляр должен быть привязан к одному пользователю. В какой момент я буду воздействовать на пользователя 5 и ожидать получения файлов пользователя 8? Это кажется неинтуитивным и, если я могу сделать прыжок, нелогичным с точки зрения правильного ООП.   -  person erisco    schedule 10.02.2011
comment
@erisco это интересный момент. Я думал, что этот метод будет использоваться по умолчанию для текущего пользователя, но сможет повторно использовать тот же метод для другого пользователя. Но я предполагаю, что я все еще думал процедурно. Вы предполагаете, что лучше было бы создать еще один экземпляр объекта для другого пользователя?   -  person JakeParis    schedule 10.02.2011
comment
Я не знаю о вашем дизайне в целом, но из того, что я могу извлечь из этого, да, я бы предложил иметь один экземпляр для каждого пользователя. Когда вы говорите повторно использовать один и тот же метод, это то, чего вы достигаете, имея несколько экземпляров, поскольку все они имеют одни и те же доступные им методы.   -  person erisco    schedule 11.02.2011


Ответы (2)


Я обычно использую null в этой ситуации:

public function getUserFiles($id = null)
{
    if ($id === null) {
        $id = $this->id;
    }
    // ...
}
person Alex Howansky    schedule 10.02.2011

Предполагая (по какой-либо причине и дизайну), в методе, в случае параметра по умолчанию, мы просто хотим вместо этого использовать атрибут, чем я бы также сделал это, как Алекс:

public function methodABC($param = NULL) {
    if ( $param === NULL ) {
        $param = $this->attributeUVW;
    }
    ...$param...
    }

... и вот полный код для игры (мои 2 цента):

<?php

    class MyClass
    {
    public $attributeUVW;
    function __construct() {
            $this->attributeUVW = 1234;
        }
    public function methodABC($param = NULL) {
        if ( $param === NULL ) {
            $param = $this->attributeUVW;
        }
        echo '<p>"'.$param.'"</p>'."\n";
        }
    }

    echo '<html>'."\n";
    echo '<body>'."\n";
    echo '<h1>class X</h1>'."\n";

    $x = new MyClass;
    $x->methodABC();
    $x->methodABC(5678);

    echo '</body>'."\n";
    echo '</html>'."\n";

?>

... печатает:

<html>
<body>
<h1>class X</h1>
<p>"1234"</p>
<p>"5678"</p>
</body>
</html>

person Jörg Brüggmann    schedule 08.12.2018