PHP ООП: почему геттер? - PullRequest
       1

PHP ООП: почему геттер?

2 голосов
/ 14 января 2010

Я новичок в ООП, и мне сложно понять необходимость метода получения.

В примере:

class foo {
    $this->bar = "test";
}

$foo = new foo();
echo $foo->bar;

Каковы потенциальные ловушки в этой ситуации, если я использую метод установки для правильной проверки обновленного значения?

Ответы [ 8 ]

6 голосов
/ 14 января 2010

Значение метода-получателя заключается в том, что он позволяет позже изменить реализацию, но оставить интерфейс прежним.

3 голосов
/ 14 января 2010

Вот классический ответ:

Допустим, вы пишете класс со свойством, представляющим температуру (в градусах F), и переносите его в метод getTemp, пока что не так уж и здорово. Теперь вам также нужно получить доступ к нему в градусах C, поэтому вы пишете метод getTempInCelcius, который преобразует температуру и возвращает новую версию, так что работают и старый, и новый способы. Затем из ваших журналов вы начинаете понимать, что getTempInCelcius получает гораздо больше вызовов, чем getTemp, поэтому вы переписываете свой класс для внутреннего использования степеней C. Если бы вы не инкапсулировали свою температуру в getTemp, это было бы невозможно без изменений всего, что использует ваш класс. Используя геттер, вы можете просто вставить туда логику, и все, кто заметит, это увеличение производительности.

1 голос
/ 14 января 2010

Есть несколько преимуществ использования методов получения. Уже упоминалось форматирование, сохранение внешнего интерфейса класса неизменным даже при изменении внутренних компонентов и отладка. Я также иногда использую их для кэширования, если у вас есть вычисляемое свойство.

например

class TestClass
{
    private $_cachedTestProperty;

    public function __get($varname)
    {
        switch ($varname)
        {
            case "testProperty":

                if (!isset($this->_cachedTestProperty))
                {
                    $this->_cachedTestProperty = /*calculate property*/
                }

                return $this->_cachedTestProperty;

                break;
        }
    }
}

Если вы сделаете это, вам нужно помнить, чтобы сбросить кэшированное значение, если другое изменение в классе сделает его устаревшим

Они также могут предоставлять доступ только для чтения к защищенным / закрытым переменным

Как всегда с этими вещами, хотите ли вы использовать публичную собственность или получатель, зависит от того, что вы пытаетесь сделать. Они не всегда лучше, это случай использования правильного инструмента для работы

1 голос
/ 14 января 2010

Ценность методов доступа заключается в том, что они позволяют вам иметь доступ к определенным областям класса, сохраняя при этом большую часть его закрытым, то есть инкапсуляцию. Это также позволяет сигнатуре класса оставаться стабильной.

0 голосов
/ 14 января 2010

Правило большого пальца состоит в том, что вы никогда не должны выставлять членов в своей структуре. Члены являются переменными в рамках вашего класса.

Теперь, с учетом вышесказанного, вы всегда должны помечать свои переменные класса как закрытые и создавать для них Accessors, что даст вам лучший способ показать только то, что необходимо для внешнего мира.

Также, когда вы используете геттеры и сеттеры, у вас есть контроль над данными, если вам нужно, вы можете отформатировать как ввод, так и вывод.

Узнайте больше о концепциях объектно-ориентированного программирования на php.net

0 голосов
/ 14 января 2010

Это дает вам больше гибкости. Код часто может в конечном итоге сделать что-то гораздо большее, чем вы изначально планировали. Например, если вы решите, что хотите, чтобы $ bar был вычисленным значением, но при этом хотите, чтобы $ foo-> getBar () возвращала строку.

function getBar()
{
    if(date('w')==0)
        return 'test';
    else
        return 'live';
}

Если вы решили, что хотите вернуть «тест» только в воскресенье (потому что даже код заслуживает выходного дня).

0 голосов
/ 14 января 2010

Получатель обеспечивает большую гибкость, так что вы можете изменить работу своего кода в фоновом режиме, сохраняя тот же интерфейс.
Например, вы можете изменить метод получения, чтобы вместо того, чтобы просто предоставлять пользователю данные, функция фактически изменяет их кем-то (расшифровывает или что-то в этом роде). Для пользователя они все еще просто вызывают геттер, но вы изменили его работу.

0 голосов
/ 14 января 2010

Одним из огромных преимуществ методов получения / установки является то, что вы можете поместить отладочный код в функции, чтобы отслеживать изменения значений и доступ к ним при тестировании. Также, если необходимо выполнить какое-либо форматирование или обработку переменной, вы можете поместить ее в геттер (или использовать другие геттеры).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...