Свойства классов в PHP. Как контролировать доступ с помощью модификаторов?

свойства классов в php. как контролировать доступ с помощью модификаторов?

Основы работы со свойствами

Свойства — это переменные, которые закрепляются за объявленным классом, и описывают его характеристики. Класс Cat может иметь свойство $hairColor, которое будет хранить окрас шерсти. Однако свойства можно использовать для любых нужд. Например, для хранения промежуточных результатов вычислений.

PHP позволяет задать свойство класса с помощью следующего выражения «модификатор_доступа $имяСвойства = значение_свойства;». Правила именования полностью совпадают с переменными, включая символ «$». Свойство может не иметь начального значения, тогда необходимо отбросить часть выражения, поставив точку с запятой сразу за его именем.

Можно создать несколько свойств в одном выражении, которое будет выглядеть следующим образом «модификатор_доступа $имяСвойства#1 = значение_свойства#1, $имяСвойства#2 = значение_свойства#2;». Просто перечислите их имена через запятую.

//Создаем класс "Очень крутой солдат"
class VeryCoolSoldier
{
    //Создание одиночного свойства
    public $name = 'Василий';

    //Создаем несколько пустых свойств
    public $boots, $ammo, $rifle;

    //Несколько свойств со значениями
    public $helmetColor = 'синий',
    $formColor = 'зеленый';
}

//Создаем объект "Очень крутого солдата"
$soldier = new VeryCoolSolider();
echo "Имя солдата: {$soldier->name}<br>";
echo "Цвет шлема: {$soldier->helmetColor}<br>";
echo "Цвет формы: {$soldier->formColor}<br>";
/*
* Результат:
* Имя солдата: Василий
* Цвет шлема: синий
* Цвет формы: зеленый
*/

Способы доступа к значениям

Чтобы взаимодействовать со свойствами внутри методов класса, необходимо использовать специальную переменную $this. Класс является шаблоном, и на стадии его определения не существует ничего, с чем можно взаимодействовать. Переменная $this после создания объекта будет содержать ссылку на него.

//Создаем класс "Автоответчика"
class AnsweringMachine
{
    //Сообщение ответа при отсутствии
    public $message = 'Меня нет дома...';

    //Метод прокрутки сообщения
    public function playMessage()
    {
        echo $this->message;
    }
}

//Создаем автоответчик и проигрываем
//сообщение об отсутствии
$answering = new AnsweringMachine();
$answering->playMessage();
/*
* Результат:
* Меня нет дома...
*/

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

//Переопределяем автоответчику свойство
//ответа и прокручиваем его
$answering = new AnsweringMachine();
$answering->message = 'Другое сообщение...';
$answering->playMessage();
/*
* Результат:
* Другое сообщение...
*/

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

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

PHP позволяет контролировать доступ с помощью модификаторов свойств. На данном этапе мы изучим только основные. Для использования модификатора, необходимо добавить его имя перед именем свойства. Если модификатор не указан, то программный код завершится с ошибкой.

Список основных модификаторов доступа:

  • public — разрешено чтение и запись в любом месте программы (как внутри класса, так и снаружи).
  • protected — запрещено чтение и запись за пределами класса. Доступ к такому свойству можно получить только в методах.
  • private — основное поведение аналогично модификатору protected, но наследующий класс не будет иметь доступа к такому свойству (о наследовании классов в следующих статьях).
//Создаем класс "Защищенного сейфа"
class SecureSafe
{
    //Свойство содержимого с модификатором
    protected $container = 'Много золота';
}

//Пытаемся получить содержимое, но программа
//завершится с ошибкой. Свойство является
//защищенным
$safe = new SecureSafe();
echo $safe->container;

Заметка
На самом деле, необходимо закрывать доступ ко всем свойствам класса. Это называется инкапсуляцией, и является лучшей практикой программирования на PHP. Доступ к значениям свойств, при таком подходе, осуществляется через специальные методы (геттеры и сеттеры). Например, метод setTitle() может принимать значение и записывать его в свойство $title.

Последние публикации