Важна ли видимость в классах PHP и почему? - PullRequest
5 голосов
/ 24 ноября 2010

Как вы знаете, класс PHP имеет частные, открытые и защищенные ключевые слова.Я только начал писать классы и мне интересно, каковы преимущества видимости классов в PHP5.

И, конечно, также недостатки ...

Ответы [ 5 ]

10 голосов
/ 24 ноября 2010

Это полезно, если вы хотите применить ООП практики, такие как Скрытие информации ( Инкапсуляция ).

Если вы объявляете членов классакак private, они не могут быть доступны из кода за пределами вашего класса.Вы должны предоставить методы для доступа к ним.Это отделяет интерфейс вашего класса от фактической реализации.
Другой код, который использует ваш класс, не должен знать имя члена класса или как вы фактически храните информацию внутри.

Пример:

Рассмотрим класс Books, который как-то дает мне список книг.Я могу определить public член, который содержит массив книг:

class Books {
    public $list;
}

С другой стороны, если я определю метод getList(), я могу изменить реализацию позже, не затрагивая код, которыйиспользует класс:

class Books {
    private $list;
    public function getList() {
         // get list from database, from XML, etc.
         // might use $list internally but does not have to
    }
}

Очевидно, вам не нужны такие модификаторы, как private, protected или public для реализации этого поведения, но это приводит к лучшей структурированностикод и более понятные интерфейсы.Представьте, что у вас есть класс, который имеет public $list и метод getList().Как узнать, какой из них использовать?
Это относится не только к получению значений, но особенно к настройке значений.

Нет недостатков, если их использовать, только преимущества ИМХО.Разница между ними заключается в сфере видимости.public члены могут быть доступны из внешнего кода, protected члены могут быть доступны из наследующих классов и private члены только из класса.

Методы также могут иметь эти модификаторы и преследовать аналогичную цель.Например, если метод объявлен как private, ясно, что это, вероятно, какой-то вспомогательный метод, который используется только для внутреннего использования и не должен вызываться извне.


Такв итоге все сводится к двум вещам:

  • Контроль : к каким частям вашего класса можно получить доступ, каким образом
  • Самодокументированиеили понимание : другие люди, использующие ваш класс, могут легче понять, к какой части вашего класса они должны получить доступ, а к какой нет.
3 голосов
/ 24 ноября 2010

Позвольте мне ответить на примере:

Оставить все это клиенту (не хорошо):

class myClass
{
    public $name; // cannot contain spaces

}

$mc = new myClass();
$mc->name = 'John Smith'; // Oh no!

Теперь с большим контролем:

class myClass
{
    private $name; // cannot contain spaces

    public function setName($value)
    {
        if (strpos($value, ' ') !== false) {
            throw new Exception('Name contains space.');
        }

        $this->name = $value;
    }

    public function getName()
    {
        return $this->name;
    }

}

$mc = new myClass();
try {
    $mc->setName('John Smith');
} catch (Exception $e) {
    echo 'Cannot set name. Reason: ', $e->getMessage();
}

Использование спецификаторов доступа позволяет лучше защитить элементы / методы от неправильного использования . Там нет никаких недостатков, кроме чего-то еще, чтобы учиться.

3 голосов
/ 24 ноября 2010

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

Я не знаю никаких недостатков (кроме того, что вам нужно написать несколько дополнительных строк кода).

1 голос
/ 24 ноября 2010

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

Внутренние процессы могут быть опасными, поэтому в этой установке предусмотрен некоторый открытый интерфейс .В этом примере это будет розетка и выключатель света.Сжечь дом с помощью выключателя света довольно сложно, не правда ли?

0 голосов
/ 24 ноября 2010

Да, они важны.Проще говоря, они не дают вашему коду доступ к вещам в неправильных местах.

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

...