Зачем делать переменные класса закрытыми?

Совершенно новичок в программировании ООП, извините, если ответ очевиден. Я видел много руководств на YouTube, где код выглядит следующим образом:

class myClass{
    private $myVar;

    function getVar(){
        return $this->myVar;
    }
}

myObject = new myClass();
print myObject->getVar();

но почему предпочтительнее сделать переменную частной, а затем обращаться к ней через функцию, а не просто использовать myObject->myVar?


person Community    schedule 01.12.2013    source источник
comment
возможный дубликат Почему частные методы в объектно-ориентированном стиле? или stackoverflow.com/questions/6865618/   -  person PeeHaa    schedule 02.12.2013
comment
Конечно, в таких проектах, как мой, я единственный программист, и у меня, кажется, есть необычная способность отслеживать то, что я делаю, поэтому я получаю выгоду от возможности использовать общедоступные переменные и читер в некоторых местах, что позволяет добиться дополнительной эффективности. из моего кода: p   -  person Niet the Dark Absol    schedule 02.12.2013


Ответы (4)


Несколько преимуществ частных переменных:

  1. Никто не может изменить его извне без вашего разрешения. Если эта переменная важна для внутреннего состояния, наличие внешнего доступа к ней может иметь катастрофические последствия, когда вам понадобится использовать ее в следующий раз (из-за другого вызова метода в вашем классе). Это большое дело.
  2. Если кто-то называет его «получить», вы можете перехватить его и при необходимости создать побочные эффекты (например, из соображений бухгалтерского учета; обратите внимание, что «магия» за кулисами, как правило, не является хорошей идеей от простого средства доступа).
  3. Значение, возвращаемое из «get», может быть не реальным конкретным значением, а результатом вычисления. Вы открываете его через метод, но на самом деле его не нужно кэшировать внутренне.

Вы также можете увидеть здесь.

Это помогло?

person FuzzyBunnySlippers    schedule 01.12.2013

В первом случае у вас есть геттер, а не сеттер, поэтому вы можете «читать только» частный $ myVar. Во втором случае $ myVar является общедоступным, поэтому вы можете просто установить и получить myVar.

Возможно, прочитайте больше о геттере и сеттере (даже в stackoverflow), чтобы понять, зачем использовать геттер и сеттер в ООП Шаблон дизайна более эффективен :)

person ahmet2106    schedule 01.12.2013

Функции get и set могут делать больше, чем просто получать и устанавливать. Например, как насчет этого:

class myClass {
    private $myVar;
    public function setVar($val) {
        if( !is_numeric($val)) throw new Exception("Input must be a number");
        $this->myVar = 0+$val;
    }
}

Если бы $myVar был общедоступным, я мог бы установить любое значение, которое я хотел, а не только числа, которые позже могли бы вызвать ошибки. Это всего лишь одно возможное приложение, имеющее бесчисленное множество применений;)

person Niet the Dark Absol    schedule 01.12.2013

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

Например, у вас может быть класс для расчета налогов на определенную сумму денег. Вы бы не хотели, чтобы кто-либо случайно изменил 0.05 сумму налога на что-то вроде 3.00 и выставил клиенту счет в тройном размере цены товара или изменил тип налоговой переменной на что-то вроде NULL и вызвал исключения / фатальные ошибки во время расчета.

С поселенцем вы можете заставить людей подчиняться вашим правилам. Вы можете проверить все, прежде чем присваивать значения частным переменным.

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

person Aristona    schedule 01.12.2013