Статические методы и свойства в PHP. Как использовать класс без объекта?

статические методы и свойства в php. как использовать класс без объекта?

Что такое статические методы и свойства?

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

PHP позволяет установить связь, объявляя статические свойства и методы. Они принадлежат к контексту самого класса, а не к конкретным объектам. Изменение такого свойства сразу отобразится на всех экземплярах класса.

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

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

//Создаем класс "Радио"
class Radio
{
    //Определяем статическое свойство
    static public $radioWave = 104;

    //Определяем статический метод
    static public function playMysic()
    {
        echo 'Воспроизводим музыку...';
    }
}

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

Доступ к статическому свойству класса

Чтобы получить или изменить значение статического свойства за пределами класса необходимо использовать оператор разрешения области видимости, который записывается двумя двоеточиями «::». Слева от него должно находиться имя класса или переменная, содержащая объект, а справа имя свойства, начинающееся с символа «$». Выражение в общем виде можно записать как «$объект::$имяСвойства = значение;».

Для обращения к свойству внутри методов класса недопустимо использовать специальную переменную $this. Она привязана к контексту объекта, в то время как статика существует только в самом классе. Вместо переменной $this нужно использовать ключевое слово self.

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

//Создаем класс "Пользователь"
class User
{
    //Cтатическое свойство количества пользователей
    static public $userCount = 0;

    //Обычное свойство порядкового номера юзера
    public $userId = null;

    //При создании нового пользователя назначаем ему
    //идентификатор и увеличиваем счетчик
    public function __construct()
    {
        $this->userId = ++self::$userCount;
    }

    //При удалении пользователя уменьшаем счетчик
    public function __destruct()
    {
        --self::$userCount;
    }

    //Показ порядкового номера текущего пользователя
    public function getUserId()
    {
        echo 'Номер пользователя - '. $this->userId .'<br>';
    }

    //Показ общего числа существующих пользователей
    public function getCount()
    {
        echo 'Общее количество - '. self::$userCount.'<br>';
    }
}

//Создаем пользователя и выводим показатели
$userFirst = new User();
$userFirst->getUserId(); //Результат: Номер пользователя - 1
$userFirst->getCount(); //Результат: Общее количество - 1

//Создаем еще двух пользователей
$userSecond = new User();
$userThird = new User();
$userThird->getUserId(); //Результат: Номер пользователя - 3
$userThird->getCount(); //Результат: Общее количество - 3

//Удаляем первого и второго пользователя
unset($userSecond, $userFirst);
$userThird->getUserId(); //Результат: Номер пользователя - 3
$userThird->getCount(); //Результат: Общее количество - 1

Вызов статических методов класса

Статические методы не имеют доступа к обычным свойствам и методам. Они могут использовать только другие статические методы или свойства.

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

Внутри класса вызов статических методов происходит через ключевое слово self, как на примере, приведенном ниже.

//Создаем класс "Подключение к сети"
class InternetConnection
{
    //Определение статического свойства
    static protected $userName = 'Дмитрий';

    //Определение открытого статического метода
    static public function doConnection()
    {
        echo 'Подключение к сети установлено!<br>';
        self::welcome();
    }

    //Защищенный статический метод приветствия
    static protected function welcome()
    {
        echo 'Добро пожаловать, '. self::$userName;
    }
}

//Вызываем методы класса без создания объекта
InternetConnection::doConnection();
/*
* Результат:
* Подключение к сети установлено!
* Добро пожаловать, Дмитрий
*/

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