Menu
Coddy logo textTech

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

Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 17 из 91.

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

Вы объявляете статический метод, используя ключевое слово static, и вызываете его с именем класса и оператором :::

<?php
class MathHelper {
    public static function add($a, $b) {
        return $a + $b;
    }
    
    public static function multiply($a, $b) {
        return $a * $b;
    }
}

echo MathHelper::add(5, 3) . "\n";
echo MathHelper::multiply(4, 2);

Вывод:

8
8

Статические методы хорошо работают со статическими свойствами. Распространенным паттерном является использование статического метода для управления общими данными класса:

<?php
class Counter {
    private static $count = 0;
    
    public static function increment() {
        self::$count++;
    }
    
    public static function getCount() {
        return self::$count;
    }
}

Counter::increment();
Counter::increment();
echo Counter::getCount();

Вывод:

2

Обратите внимание, что статические методы не могут использовать $this, потому что экземпляр объекта отсутствует. Они могут обращаться только к статическим свойствам и другим статическим методам, используя self::.

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

challenge icon

Задание

Легко

Давайте создадим систему генерации идентификаторов (ID), которая использует статические методы и свойства для создания уникальных идентификаторов без необходимости создания экземпляров объектов.

Вы создадите два файла для организации вашего кода:

  • IdGenerator.php — Определите класс IdGenerator, который управляет генерацией уникальных ID, используя только статические члены. Класс должен иметь приватное статическое свойство $lastId, начинающееся с 0, и приватное статическое свойство $prefix, установленное в "ID". Создайте статический метод generate(), который увеличивает последний ID и возвращает отформатированную строку, объединяющую префикс и новый ID (например, "ID1", "ID2" и т. д.). Добавьте статический метод setPrefix($newPrefix), который изменяет префикс, и статический метод getLastId(), который возвращает текущее значение $lastId.
  • main.php — Подключите файл класса IdGenerator. Сгенерируйте два ID, используя префикс по умолчанию, и выведите каждый из них на новой строке. Затем измените префикс на "USER" с помощью статического метода, сгенерируйте еще два ID и выведите каждый из них. Наконец, выведите номер последнего ID, вызвав соответствующий статический метод.

Помните, что статические методы вызываются непосредственно у класса с помощью ClassName::methodName(), а внутри класса доступ к статическим свойствам осуществляется через self::$propertyName. Поскольку экземпляра объекта не существует, вы не можете использовать $this в статических методах.

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

Шпаргалка

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

<?php
class MathHelper {
    public static function add($a, $b) {
        return $a + $b;
    }
}

echo MathHelper::add(5, 3); // 8

Статические методы могут обращаться к статическим свойствам с помощью self:::

<?php
class Counter {
    private static $count = 0;
    
    public static function increment() {
        self::$count++;
    }
    
    public static function getCount() {
        return self::$count;
    }
}

Counter::increment();
echo Counter::getCount(); // 1

Статические методы не могут использовать $this, так как экземпляр объекта отсутствует. Они могут обращаться только к статическим свойствам и другим статическим методам с помощью self::.

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

Попробуйте сами

<?php

// Подключите файл класса IdGenerator
require_once 'IdGenerator.php';

// TODO: Сгенерируйте два ID, используя префикс по умолчанию, и выведите каждый на новой строке

// TODO: Измените префикс на "USER", используя статический метод

// TODO: Сгенерируйте еще два ID и выведите каждый на новой строке

// TODO: Выведите последний номер ID, используя соответствующий статический метод

?>
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование