права доступа к свойствам и методам
Права доступа к свойствам и методам — это на первый взгляд всего лишь три слова: 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: PHP, ООП, ос, пример, решение
Также рекомендую к прочтению:
Август 7th, 2009 at 18:14
Статья безграмотная и с ошибками.
Не хватило сил дочитать до конца.
Автор не разбирается в предметной области.
Вы знаете, что такое класс и чем от него отличается экземпляр класса ?
Август 7th, 2009 at 23:01
вместо того, что бы рассыпаться в необоснованых обвинениях, Вы бы удосужились указать на то, что Вам показалось неверным.
Иначе возникает ощущение что Вы просто тролль.
И да - я знаю чем отличается класс от экземпляра класса.