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

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

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

Методы — это функции, привязанные к контексту класса, и описывающие выполняемые им действия. Например, класс RocketLouncher (рус. пусковая установка) может иметь метод targetCapture(), вызов которого выполнит «захват цели».

PHP позволяет создать метод класса с помощью следующего выражения «модификатор_доступа function имяМетода(/* список параметров */) {/* программный код */}». Правила именования метода, определения параметров и программного кода полностью аналогичны тем же операциям с функциями, за исключением указания модификатора доступа. Если вы ещё не знакомы с данными правилами, изучите статью «работа с пользовательскими функциями в PHP» из нашего учебного курса.

//Создаем класс "Пусковая установка"
class RocketLouncher
{
    //Определяем метод захвата цели
    public function targetCapture($name)
    {
        echo "Цель '$name' захвачена!";
    }
}

//Создаем объект пусковой установки и
//вызываем её метод
$louncher = new RocketLouncher();
$louncher->targetCapture('лошадка');
/*
* Результат:
* Цель 'лошадка' захвачена!
*/

Способы вызова методов

Для вызова метода необходимо создать новый объект, поместить его в переменную и обращаться к ней с использованием оператора доступа «->» . Выражение в общем виде можно записать как «$объект->имяМетода(/* значения параметров */);».

//Создаем класс "Заядлого рыболова"
class Fisherman
{
    //Метод полного статуса о рыбалке
    public function fishingFullReport()
    {
        echo "Текущее время: 14:56<br>";
        $this->fishingSuccess();
    }

    //Метод вывода успехов рыбалки
    public function fishingSuccess()
    {
        echo 'Пока ничего не поймал =(';
    }
}

//Создаем объект и вызываем метод статуса
$fisherman = new Fisherman();
$fisherman->fishingSuccess();
/*
* Результат:
* Пока ничего не поймал =(
*/

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

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

//Создаем объект и вызываем метод
//полного доклада, который внутри себя
//вызывает другой метод
$fisherman = new Fisherman();
$fisherman->fishingFullReport();
/*
* Результат:
* Текущее время: 18:56
* Пока ничего не поймал =(
*/

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

К некоторым методам можно закрыть доступ извне. Попытка их вызова завершится фатальной ошибкой. Это может быть необходимо для разделения функционала класса на группы: только для внутренних нужд и для внешнего использования.

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

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

  • public — разрешен вызов в любом месте программы (как внутри класса, так и снаружи).
  • protected — запрещен вызов за пределами класса. Доступ к такому методу можно получить только в других методах.
  • private — основное поведение аналогично модификатору protected, но наследующий класс не будет иметь доступа к такому методу (о наследовании классов в следующих статьях).
//Создаем класс "Кредитной карты"
class CreditCard
{
    //Возвращает текущее кол-во денег
    private function getBalance()
    {
        return 30000;
    }

    //Метод снятия денег со счета
    public function withdrawMoney($amount)
    {
        echo "Снято денег: $amount$<br>";

        $balance = $this->getBalance() - $amount;
        echo "Остаток счета: $balance$";
    }
}

//Создаем объект кредитной карты
$CreditCard = new CreditCard();

//Снимаем деньги через публичный метод
$CreditCard->withdrawMoney(600);
/*
* Результат:
* Снято денег: 600$
* Остаток счета: 29400$
*/

//Вызов приватного метода
//завершится фатальной ошибкой
$CreditCard->getBalance();

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