Что считается лучшей практикой для написания классов ООП, когда речь идет об использовании свойства внутри страны.использовать класс getters или свойства класса? (PHP)
Рассмотрите следующий класс;
<?php
Class Foo
{
/**
* @var null|string
*/
protected $_foo;
/**
* @return null|string
*/
public function getFoo()
{
return $this->_foo;
}
protected function _doSomething()
{
$foo = $this->_foo;
$result = null;
// ...
return $result;
}
}
Как вы видите, IM, используя _foo свойства в _doSomething(), хотя суб-класс может переопределить getFoo(), возвращающую вычисленное значение не сохраняется обратно в _foo; это недостаток.
Что мне делать?
- знак добытчик в качестве окончательного, используйте свойство внутренне (без дополнительных вызовов функций, не соблюдение конечного разработчика использовать _foo как свойство, так как он защищен)
- использование getFoo() внутренне, знак _foo как частное (дополнительная функция звонки)
Оба варианта являются водонепроницаемыми, однако им серьезно относятся ко всем дополнительным вызовам функций, поэтому я склонен использовать вариант 1, однако вариант 2 будет более «истинным ООП» имхо.
http://fabien.potencier.org/article/47/pragmatism-over-theory-protected-vs-private Также читайте, который также предполагает вариант 2:/
Другой связанный с этим вопрос; Если свойство имеет сеттер, если это свойство является приватным, принуждение конечных разработчиков использовать его в подклассах или должно ли оно быть неписаным правилом, отвечающим за установку действительного значения свойства?
Вариант 3: Используйте регулярные 'public' свойства и полагайте, что другие разработчики могут читать комментарии к doc. Однако это просто вопрос дизайна, поэтому трудно сказать что-то правильно и что-то еще не так. (Sidenote: свойства OOP__theory_ определяют состояние и методы определяют поведение. В этом контексте getters/seters ошибочны, потому что доступ к свойству не является поведением) – KingCrunch
публичные свойства - плохая идея, они позволяют внешним агентам к futz с внутренним состоянием класса. – GordonM
Также не существует такой вещи, как «readonly properties» в PHP, поэтому вам нужно ... (помимо магии __get, которая неявная, поэтому я предпочитаю геттер) –