Изучаем статические методы PHP: от основ до продвинутых техник

Раздел: PHP -> Функции PHP

Основные принципы статических методов в PHP

Как объявить статический метод и в чем заключается эффективный подход?

Для объявления статического метода используется ключевое слово static. Такой метод принадлежит классу, а не экземпляру. Наиболее эффективное решение - четко разграничивать случаи: если метод не требует доступа к свойствам и методам конкретного объекта, его следует делать статическим. Это улучшает читаемость и производительность (вызов без создания экземпляра).


class Utils {
    public static function formatPrice(float $price): string {
        return number_format($price, 2, ',', ' ') . ' руб.';
    }
}

echo Utils::formatPrice(1234.5);

функции работы с массивом php (функции для работы с массивами в php)

1 234,50 руб.

функция file php (функция file() в php)

Типичная ошибка - попытка обратиться внутри статического метода к $this. Контекста объекта нет, поэтому такой код вызовет фатальную ошибку. Решение: либо передавать данные через параметры, либо использовать статические свойства.

Как получить доступ к статическому свойству?

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


class Counter {
    public static int $count = 0;

    public static function increment(): void {
        self::$count++;
    }

    public static function getCount(): int {
        return self::$count;
    }
}

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

функция get php (функция get() в php)

2

функция php выводит данные на экран (вывод данных на экран в php)

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

В чем разница между self:: и static::?

self:: ссылается на класс, в котором метод определён, а static:: - на класс, который был вызван во время выполнения (позднее статическое связывание). Для гибкости при наследовании рекомендуется использовать static::.


class ParentClass {
    public static function who() {
        echo __CLASS__;
    }

    public static function testSelf() {
        self::who();   // всегда ParentClass
    }

    public static function testStatic() {
        static::who(); // будет вызван метод из класса-потомка, если переопределён
    }
}

class ChildClass extends ParentClass {
    public static function who() {
        echo __CLASS__;
    }
}

ChildClass::testSelf();   // ParentClass
ChildClass::testStatic(); // ChildClass

статическая функция php (статические методы в php)

ParentClassChildClass

Php функции даты (функции даты в php)

Распространённая проблема - использование self:: в наследниках, когда ожидается вызов переопределённого статического метода. Решение - заменить self:: на static:: в родительском классе, если планируется переопределение.

Как реализовать паттерн Singleton с помощью статического метода?

Одиночка гарантирует единственный экземпляр класса. Статический метод getInstance() управляет созданием объекта.


class Database {
    private static ?Database $instance = null;

    private function __construct() {}

    public static function getInstance(): Database {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
}

$db = Database::getInstance();

Проблема: такие классы сложно тестировать и они нарушают принцип инверсии зависимостей. Рекомендуется использовать контейнер внедрения зависимостей, а не Singleton.

- функция include php (подключение файлов с помощью include в php)
- написать функцию php (создание функции в php)
- Php глобальные функции (глобальные функции в php)

Расширенные примеры статических методов PHP

Ниже приведены дополнительные сценарии использования статических методов с подробными пояснениями.

Пример

// Пример 1: Статический фабричный метод
class Car {
    private string $model;

    private function __construct(string $model) {
        $this->model = $model;
    }

    public static function createSUV(): self {
        return new self('SUV-2024');
    }

    public static function createSport(): self {
        return new self('Sport-2024');
    }

    public function getModel(): string {
        return $this->model;
    }
}

$suv = Car::createSUV();
echo $suv->getModel();
SUV-2024

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

Пример

// Пример 2: Статический счётчик с наследованием и поздним связыванием
class Animal {
    protected static int $count = 0;

    public static function add(): void {
        static::$count++;
    }

    public static function getCount(): int {
        return static::$count;
    }
}

class Dog extends Animal {}
class Cat extends Animal {}

Dog::add();
Dog::add();
Cat::add();

echo 'Собак: ' . Dog::getCount() . ', Кошек: ' . Cat::getCount();
Собак: 2, Кошек: 1

Благодаря static::$count каждый подкласс имеет собственную копию статического свойства (если не переопределено), что позволяет вести раздельную статистику.

Пример

// Пример 3: Статический метод в трейте
Trait Loggable {
    public static function log(string $message): void {
        echo '[' . date('Y-m-d H:i:s') . '] ' . $message . PHP_EOL;
    }
}

class App {
    use Loggable;
}

App::log('Приложение запущено');
[2025-03-29 12:00:00] Приложение запущено

Трейты позволяют повторно использовать статический код в разных классах без наследования.

Пример

// Пример 4: Вызов родительского статического метода через static::
class Base {
    public static function identify(): void {
        echo 'Base';
    }

    public static function override(): void {
        static::identify();
    }
}

class Derived extends Base {
    public static function identify(): void {
        echo 'Derived';
    }
}

Derived::override(); // Derived
Derived

Если бы в Base::override() использовалось self::identify(), результат был бы 'Base'. static:: обеспечивает полиморфное поведение.

Статические методы в PHP - comments

En
статическая функция php (php)