Я знаю, что это, вероятно, субъективно, но я прочитал эту страницу оптимизации из Google для PHP, и они предлагают использовать свойство переменной напрямую без использования геттеров и сеттеров. Понятно, что я вижу прирост производительности в этом, но действительно ли это хорошая практика проектирования?
Их пример с использованием геттера / сеттера:
class dog { public $name = ''; public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } } $rover = new dog(); $rover->setName('rover'); echo $rover->getName();
Рекомендуемая оптимизация:
$rover = new dog(); $rover->name = 'rover'; echo $rover->name;
Это было бы приятным изменением в моем процессе проектирования, поскольку я вижу необходимость убирания геттеров / сеттеров, но какие другие препятствия / выгоды могут возникнуть при этом?
Сначала я был удивлен, я был как … wtf. Но после того, как я несколько секунд обмотал себе мозг, я понял, что пример вызывает функцию getter 1 миллион раз в цикле. Конечно, если переменная обернута в getter, мы добавили инструкции, и, конечно, это займет больше времени.
На мой взгляд, в большинстве ситуаций это очень тривиально, потому что мне еще предстоит пройти через скрипт, который приближается к событию, близкому к вызову getters 1 миллион времени при запуске. Если вам нужно сжать производительность до последней капли, хорошо знать эту технику оптимизации.
Это зависит от того, $name
ли $name
или нет. Если это не так, вы не можете напрямую его получить / изменить. Компромисс выставляет внутренние элементы данных вашего класса непосредственно интеграторам. Это может быть хорошо для некоторых классов, но не для других.
Например, вы не захотите, чтобы другие могли изменять цену продукта непосредственно в классе Product
.
Я бы сказал, что это действительно вопрос личных предпочтений. Если производительность действительно важна, то, думаю, вы ответили на свой вопрос.
Тем не менее, в первом примере вы можете получить доступ к имени dog::name
без геттера / сеттера, как и в своем втором примере: $rover->name = 'rover';
потому что $name
является общедоступным.
Если вы специально хотите скрыть член класса, вам нужно объявить переменную private
или protected
и тогда понадобится геттер / сеттер.