Статические методы и свойства
Часть раздела Объектно-ориентированное программирование путешествия по 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::.
Ключевой момент: Статические методы полезны для вспомогательных функций, которым не требуется состояние объекта, или для управления данными на уровне класса. Они обеспечивают функциональность без необходимости создания экземпляра объекта.
Задание
ЛегкоДавайте создадим систему генерации идентификаторов (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, используя соответствующий статический метод
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Итоги — Простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыИтоги — Иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateПодробный разбор модификаторов доступаГеттеры и сеттерыСокрытие данныхConstructor Promotion (8.0)Итоги — Система учета студентов10Продвинутые концепции ООП
Композиция против наследованияВнедрение зависимостейАнонимные классыПеречисления (PHP 8.1)Файберы (PHP 8.1)Глубокое погружение в клонирование объектовГенераторы и итераторы13Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий2Пространства имен и автозагрузка
Введение в пространства именКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerИтоги: структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс против абстрактного классаType Hinting с интерфейсамиИтоги — Калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeИтоги — Кастомная коллекция11Система типов и обработка ошибок
Объявление типовNullable-типыТипы объединения и пересеченияКлассы исключенийИерархия пользовательских исключенийTry, Catch, FinallyИтоги — Валидатор форм14Проект: Управление библиотекой
Обзор проектаКлассы Book и User3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищенные свойстваСвойства Readonly (PHP 8.1)Итоги — Менеджер банковского счета6Полиморфизм
Снова о переопределении методовПолиморфизм через интерфейсыType Hinting и Union TypesПозднее статическое связываниеИтоги — Payment Processor9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy