Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

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

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

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

Метод со словом 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 — корзина одна на всех покупателей

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

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.