2016-05-22 12 views
2

У меня есть класс в php и хочу знать, существует ли конкретное соглашение о том, как установить эти частные переменные в моем конструкторе.Как установить переменные класса в PHP?

Должен ли я установить их с помощью setter или с this?

class foo { 

    private $bar; 

    public function __construct($foobar) { 
    $this->bar = $foobar; 
    } 

    public function setBar($bar) { 
    $this->bar = $bar; 
    } 

    public function getBar() { 
    return $this->bar; 
    } 
} 

ИЛИ

class foo { 

    private $bar; 

    public function __construct($foobar) { 
    $this->setBar($foobar); 
    } 

    public function setBar($bar) { 
    $this->bar = $bar; 
    } 

    public function getBar() { 
    return $this->bar; 
    } 
} 

Или мой вопрос просто философский? Этот вопрос можно задать с помощью getters. Но я думаю, вы должны использовать setters и getters при обработке частных переменных вашего родительского класса.

+2

Поскольку ваш геттер и сеттер буквально ничего не делают, кроме как получить/установить переменную без ограничений, вы также можете сделать ее «публичной» и изменить ее напрямую;) –

+0

Хорошая точка. Таким образом, вы просто используете 'seters' и' getters' только тогда, когда хотите сделать что-то еще, кроме как вернуть их так, как они есть? – Jurik

+1

@NiettheDarkAbsol - Я не согласен. 1) Сделать все методом для объекта - экономит путаницу 2) Что произойдет в будущем, если один из них будет рассчитан? См. Http://programmers.stackexchange.com/questions/176876/why-shouldnt-i-be-using-public-variables-in-my-java-class –

ответ

2

В конструкторе следует использовать setBar из-за проверки данных и последующего обслуживания.

// a developer introduces a bug because the string has padding. 
$foo->setBar("chickens "); 

// the developer fixes the bug by updating the setBar setter 
public function setBar($bar) { 
    $this->bar = trim($bar); 
} 

// the developer doesn't see this far away code 
$f = new foo("chickens "); 

Разработчик отправляет код в производство, думая, что он исправил ошибку.

1

В таком тривиальном примере да, ваш вопрос в основном философский! :) Однако, если ваш сеттер выполнит некоторые специальные действия (такие как проверка правильности ввода или изменение его), я бы рекомендовал использовать вторую схему.

+0

Это хороший момент - поэтому сеттер - хорошее место для подтвердить вход? – Jurik

+1

Хорошая точка! Ну, по «input» я фактически имел в виду аргумент функции, а не вход пользователя. Вообще говоря, я предпочитаю проверять вход пользователя отдельно. Однако, с некоторыми простыми приложениями, вы не всегда хотите следовать всем лучшим практикам. Все зависит от ваших потребностей. – Abrab

1

Это:

class foo { 

    private $bar; 

    public function __construct($foobar) { 
    $this->bar = $foobar; 
    } 

    public function setBar($bar) { 
    $this->bar = $bar; 
    } 

    public function getBar() { 
    return $this->bar; 
    } 
} 

ничем не отличается, чем это:

класс Foo {

public function __construct($bar){ 
    $this->bar = $bar; 
} 

public $bar; 

Одна из причин использовать поглотитель и сеттера, если вы только разрешить переменную устанавливаются по конструкции объекта следующим образом:

class foo { 

    private $bar; 

    public function __construct($foobar) { 
    $this->bar = $foobar; 
    } 


    public function getBar() { 
    return $this->bar; 
    } 
} 

Поэтому не следует чрезмерно использовать геттеры и сеттеры, если это необходимо