Статические свойства и методы
Обычные свойства и методы принадлежат объекту: у каждого объекта свои данные. Статические принадлежат самому классу. Они существуют в одном экземпляре, и объект для них не нужен.
Статический метод
Метод со словом static вызывают через имя класса и два двоеточия:
<?php
class Math
{
public static function square(int $number): int
{
return $number * $number;
}
}
echo Math::square(5); // 25Объект new Math() создавать не пришлось. Внутри статического метода нет $this — объекта ведь нет.
Статическое свойство
Статическое свойство общее для всех объектов класса:
<?php
class Counter
{
public static int $count = 0;
}
Counter::$count++;
Counter::$count++;
echo Counter::$count; // 2Перед именем свойства сохраняется знак $.
self
Внутри класса к статическим членам обращаются через self:
<?php
class User
{
private static int $created = 0;
public function __construct(public string $name)
{
self::$created++;
}
public static function total(): int
{
return self::$created;
}
}
new User('Анна');
new User('Олег');
echo User::total(); // 2Счётчик один на всех: каждый новый объект увеличивает общее значение.
Фабричный метод
Частое применение статических методов — создание объекта с понятным именем вместо конструктора:
<?php
class Color
{
private function __construct(public int $red, public int $green, public int $blue) {}
public static function fromHex(string $hex): self
{
return new self(...sscanf($hex, '#%02x%02x%02x'));
}
}
$color = Color::fromHex('#7c3aed');
echo $color->red, ' ', $color->green, ' ', $color->blue; // 124 58 237Конструктор закрыт словом private, поэтому создать объект можно только через fromHex().
static вместо self
self всегда означает класс, в котором написан код. static — класс, от имени которого вызвали метод. Разница видна при наследовании:
<?php
class Model
{
public static function create(): static
{
return new static();
}
}
class Post extends Model {}
echo get_class(Post::create()); // PostС new self() получился бы объект Model.
Константы класса
Константы тоже принадлежат классу и вызываются через два двоеточия:
<?php
class Order
{
public const STATUS_NEW = 'new';
public const STATUS_PAID = 'paid';
}
echo Order::STATUS_PAID; // paidЧастая ошибка
Статическое свойство — это общая переменная для всей программы. Любой код может её изменить, и найти, кто именно это сделал, трудно. Не храните в статических свойствах данные, которые относятся к конкретному объекту:
<?php
class Cart
{
public static array $items = [];
}
Cart::$items[] = 'чай';
Cart::$items[] = 'кофе';
echo count(Cart::$items); // 2 — корзина одна на всех покупателейСтатические методы хороши для вспомогательных функций и фабрик, а состояние держите в объектах.