права доступа к свойствам и методам

Права доступа к свойствам и методам — это на первый взгляд всего лишь три слова: privat, protected и public. Но что скрывается за ними? Какие преимущества это дает в разработке? И как их правильно использовать? Здесь, как и во всех других аспектах программрования, без практики не разобраться…

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

Private — объявляет метод или свойство доступным только в том классе в котором он присутствует. Тоесть к private методам и свойствам мы не можем обращаться ни из объектов, ни из дочерних классов.

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

Public — публичный. Классы и методы, объявленные public, могут быть доступны как внутри самого класса, так и в дочерних классах и в объектах, реализовавших класс.

Сразу хочу заметить, что при наследовании, методы доступа изменяться могут только к более лояльным. тоесть в следующей последовательности, но не обратно: private → protected → public

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

Вобщем-то все методы доступа используются исключительно для самодокументации кода и не несут никакой логической составляющей, так что и без них жинь только тяжела, но не невозможн, что доказывает РНР4, в котором все методы и свойства были публичными…

Практика

Иногда случаются ситуации, когда этих методов доступа недостаточно. Тоест, например, мы можем хотеть иметь доступ из объекта на чтение какого-то свойства, но при этом не иметь возможности в него писать. Самое простое решение: объявить свойство public и добавить комментарий /* только для чтения */, но про комментарий можно ненароком забыть и испортить логику поведения программы, вклинившись с нестандартным значением посреди выполения. тогда приходит время использовать геттеры (getter’s). Геттер — не что иное, как метод класса, реализующий исключительную возможность читать не публичные свойства из объекта. Вот пример:
[php]
class A {
private $a = 7;//мы не можем читать и писать в это свойство из объекта, реализующего этот класс

public function getA() { //публичный метод будет доступен объекту для обращения
return $this->a; //внутри класса мы можем получать доступ к приватным свойствам
}
}

$obj = new A();
echo $obj->getA();//мы получили значение приватной переменной $a
[/php]

Похожим способом ведут себя и сеттеры (setter’s), когда нам необходимо иметь возможность установить значение переменной, но не читать ее наприямую, так как она, к примеру, должна быть преобразована прежде чем быть использованой. Пример метода сеттера:
[php]
//…
public funtion setA($value) { //метод будет доступен для объекта
$this->a = $value; //приватное свойство $a может быть установленно внутри класса, но не доступно для прямого вияния из объекта
}
//…
[/php]

Хорошей практикой является сокрытие всех свойств методом private и, в зависимости от нужд, создавать для них сеттеры или геттеры, но нужно быть внимательным, что если для свойства существует и сеттер и геттер, то не проще ли их убрать, а свойство сделать публичным? :)

Tags: , , , ,

Также рекомендую к прочтению:

2 Responses to “права доступа к свойствам и методам”

  1. Николай Says:

    Статья безграмотная и с ошибками.
    Не хватило сил дочитать до конца.
    Автор не разбирается в предметной области.

    Вы знаете, что такое класс и чем от него отличается экземпляр класса ?

  2. Алексей Токарь Says:

    вместо того, что бы рассыпаться в необоснованых обвинениях, Вы бы удосужились указать на то, что Вам показалось неверным.
    Иначе возникает ощущение что Вы просто тролль.

    И да - я знаю чем отличается класс от экземпляра класса.

Leave a Reply

Введите следующие символы: