У меня есть класс в 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
при обработке личных переменных вашего родительского класса.
Вы должны использовать 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 ");
Разработчик отправляет код в производство, думая, что он исправил ошибку.
В таком тривиальном примере, да, ваш вопрос в основном философский! 🙂
Однако, если ваш установщик будет выполнять какие-то особые действия (например, проверять правильность ввода или модифицировать его), я бы порекомендовал использовать вторую схему.
Это:
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;
}
}
Так что не злоупотребляйте геттерами и сеттерами без необходимости