Зачем использовать сеттер, если они могут просто передавать данные в конструктор, если свойство установлено как личное?
Пример:
class recover_password{
private $password;
function __construct($password){
$this->password = $password;
$this->show_pass();
}
function show_pass(){
echo $this->password;
}
}
class recover_password{
private $password;
function set_pass($password){
$this->password = $password;
$this->show_pass();
}
function show_pass(){
echo $this->password;
}
}
//First object
$rec_pass = new recover_password(12345);
//Second object
$rec_pass = new recover_password();
$rec_pass->set_pass(12345);
Чтобы сначала ответить на широкий вопрос в заголовке («Какой смысл сеттеров?»):
Вы используете сеттеры в отличие от прямого доступа к свойствам ($obj->prop = 'foo'
) иметь больше контроля над тем, какие свойства разрешено устанавливать для объекта и когда они могут быть установлены. Сеттер, функция, может изменить или полностью отклонить значение, которое вы пытаетесь установить; это невозможно с простым присваиванием свойства.
Ответить на вопрос из кода («Зачем добавлять setFoo($foo)
метод в дополнение к / вместо просто __construct($foo)
? «):
Это зависит от того, какой объект вы хотите создать. Это абсолютно разумно иметь неизменный объекты, которые получают свои данные один раз при создании экземпляра, а затем делают невозможным изменение этого значения. Также абсолютно разумно иметь объект, для которого вы можете установить значение в любое время после его создания. Оба случая полезны в разных ситуациях.
Вы можете даже сделать оба сразу. Требование аргумента к конструктору гарантирует, что ваш объект всегда будет всегда иметь определенное значение. Затем вы также можете разрешить изменение этого значения с помощью установщика. Использование обоих вместе гарантирует, что ваш объект всегда находится в действительное состояние; то есть, что у вас не может быть экземпляра объекта, если он не имеет определенного значения. Например.:
class Foo {
protected $bar;
public function __construct(Bar $bar) {
$this->bar = $bar;
}
public function setBar(Bar $bar) {
$this->bar = $bar;
}
}
Этот класс всегда будет иметь значение для $bar
действительного типа (Bar
). Вы можете изменить значение по мере необходимости, но невозможно установить недопустимые значения или не иметь значения. Выход из конструктора будет означать, что вы можете создать экземпляр класса без Bar
если вы не используете сеттер, это означает, что вы не сможете изменить его после создания экземпляра.
Других решений пока нет …