Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная №6. Модификаторы доступа.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.7 Mб
Скачать

Лабораторная работа №6. Модификаторы доступа

До сих пор мы объявляли свойства и методы класса, не задумываясь особенно, должны ли они быть доступны в программе, или же используются только для внутренних целей. Модификатор public, знакомый нам по предыдущей главе, имеет как раз такой смысл. Однако в крупных программах, а также законченных библиотеках следует ограничивать доступ к свойствам и методам классов, разрешая только то, что действительно необходимо программе, и "скрывая" все остальное.

ЗАМЕЧАНИЕ

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

Модификаторы доступа

В РНР существуют три модификатора ограничения доступа: public, protected и private. Их можно указывать перед описанием метода или свойства класса.

Рubliс: открытый доступ

Члены класса, помеченные ключевым словом public ("публичный", "открытый"), доступны для использования извне класса (например, из вызывающей программы). Вот пример:

Private: доступ только из методов класса

С использованием ключевого слова private ("личный", "закрытый") вы можете сделать члены касса "невидимыми" из вызывающей программы, будто бы их и нет. В то же время, методы "своего" класса могут обращаться к ним без всякого ограничения. Пример:

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

Protected: доступ из методов производного класса

Модификатор protected ("защищенный") с точки зрения вызывающей программы выглядит точно так же, как и private: он запрещает доступ к членам объекта извне. Однако по сравнению с private он более "либерален", ибо позволяет обращаться к членам не только из "своих" методов, но также и из методов производных классов (если используется наследование). О наследовании мы подробно поговорим в следующей главе, а пока только скажем, что "защищенными" обычно делают лишь методы, но не свойства классов. Это позволяет создавать "полуслужебные" функции, которые, с одной стороны, выполняют низкоуровневые действия и не должны быть "видны" в основной программе, а с другой, могут использоваться в классах-потомках.

Неявное объявление свойств

Давайте остановимся на одной интересной особенности РНР. Речь идет о том, что операторы:

$this->property = 101;

$obj->property = 303;

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

$key = "test";

$obj->$key = 314;

При этом в объекте $obj создастся свойство с именем Stest и значением 314, а РНР даже "не пикнет", в том числе в режиме контроля ошибок E_ALL|E_STRICT.

Общие рекомендации

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

Вот некоторые из них:

  • Скрывайте при помощи модификатора private как можно больше данных и методов. Оставляйте открытыми только те члены класса, которые действительно моrут при­годиться вызывающей программе.

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

  • Группируйте открытые методы в начале класса, а закрытые - в его конце. Это поможет выделить интерфейс класса (методы, доступные извне).

  • Старайтесь не создавать открытые свойства вообще. Делайте их закрытыми (private) или, в крайнем случае, - защищенными (protected). Доступ к свойствам лучше организовывать при помощи открытых методов - так можно, например, запретить изменение свойства, или выполнить некоторые действия перед его считыванием.

Класс - self, объект - $this

Классы выступают в качестве шаблонов для объектов. Для того чтобы обратиться к внутреннему содержимому объекта, используется ключевое слово Sthis. Для обращения к внутреннему содержимому класса используется ключевое слово self (рис. 1). Как видно, ключевое слово $this снабжено символом доллара, чтобы подчеркнуть связь с переменными. В то время как ключевое слово self обходится без символа доллара - это указание на то, что обращаемся мы не к переменной.

Рис. 1. self используется дм обращения к внутренним переменным и методам класса, а $this - к переменным и методам объекта

Особенностью статических членов и методов является тот факт, что они определяются не на уровне объекта, а на уровне класса.

Статическое свойство недоступно через обращение $this->property или $obj->property. Вместо этого используется оператор : : и либо имя класса (ИмяКласса:: $property), либо ключевое слово self {self:: $property).

Статический метод во время своего запуска не получает ссылку $this, поэтому он может работать только со статическими членами (свойствами и другими методами) своего класса.