Статичные функции класса: синтаксис и примеры в PHP

Раздел: PHP -> Объектно-ориентированное программирование в PHP

Статические методы в PHP: все, что нужно знать

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

class MathHelper {
    public static function square($num) {
        return $num * $num;
    }
}
echo MathHelper::square(5); // 25

Php self static (self и static в php)

Метод вызывается через двойное двоеточие (::) без создания объекта. Внутри статического метода нельзя использовать $this, так как нет ссылки на текущий объект. Для доступа к другим статическим членам используется self:: или static::.

Как объявить статический метод и обратиться к нему?

Ключевое слово static ставится перед function (public static function). Вызов: ИмяКласса::имяМетода().

class User {
    public static function create($name) {
        return new self($name);
    }
    private function __construct($name) {}
}
$user = User::create('Alice');

Static classes php (статические классы в php)

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

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

Через self::$property. Обратите внимание на знак $.

class Counter {
    public static $count = 0;
    public static function increment() {
        self::$count++;
    }
}
Counter::increment();

Php static method (статические методы в php)

Как вызвать статический метод из нестатического метода?

Можно использовать self::method() или static::method() внутри обычного метода. Также допустим вызов через имя класса.

class Logger {
    public static function log($msg) {
        echo "[LOG] $msg";
    }
    public function process($data) {
        self::log('Processing data');
        // или Logger::log(...)
    }
}

Php 8 class (классы php 8 (нововведения))

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

Дочерний класс может объявить свой статический метод с тем же именем. Вызов через static::method() в родителе приведет к вызову метода дочернего класса (позднее статическое связывание).

class ParentClass {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); // позднее связывание
    }
}
class ChildClass extends ParentClass {
    public static function who() {
        echo __CLASS__;
    }
}
ChildClass::test(); // ChildClass

Php class method (метод класса php)

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

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

Статический метод getInstance() возвращает единственный экземпляр класса, хранящийся в статическом свойстве.

class Singleton {
    private static ?self $instance = null;
    private function __construct() {}
    public static function getInstance(): self {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
}
$obj = Singleton::getInstance();

Class string php (класс для работы со строками php)

Проблема: при наследовании Singleton не сохраняется единственность для каждого дочернего класса. Для этого нужно использовать static::$instance.

Как использовать статические методы в трейтах?

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

trait TimestampTrait {
    public static function now() {
        return date('Y-m-d H:i:s');
    }
}
class Event {
    use TimestampTrait;
}
echo Event::now(); // 2025-03-21 12:34:56

Include class php (подключение класса в php (include/require))

Как объявить статический метод в интерфейсе? (PHP 8.1+)

Начиная с PHP 8.1 можно объявить статический метод в интерфейсе. Реализующий класс обязан определить его как статический.

interface ValidatorInterface {
    public static function validate($data): bool;
}
class EmailValidator implements ValidatorInterface {
    public static function validate($data): bool {
        return filter_var($data, FILTER_VALIDATE_EMAIL) !== false;
    }
}
var_dump(EmailValidator::validate('test@example.com')); // bool(true)

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

Пример с кэшированием через статическое свойство

Статические свойства сохраняют значение на протяжении всего скрипта. Это удобно для кэширования данных.

Пример
class CachedCalculator {
    private static array $cache = [];

    public static function factorial(int $n): int {
        if (isset(self::$cache[$n])) {
            return self::$cache[$n];
        }
        $result = ($n <= 1) ? 1 : $n * self::factorial($n - 1);
        self::$cache[$n] = $result;
        return $result;
    }
}

echo CachedCalculator::factorial(5); // 120
echo CachedCalculator::factorial(6); // 720 (использует кэш для 5)

Результат:

120
720

Статический метод с фабричным паттерном и поздним связыванием

Фабричный метод создает объект нужного класса. Использование static:: позволяет переопределить создаваемый объект в наследнике.

Пример
abstract class Document {
    public abstract function render(): string;

    public static function create(string $type): static {
        return match ($type) {
            'pdf' => new PdfDocument(),
            'html' => new HtmlDocument(),
            default => throw new InvalidArgumentException('Unknown type'),
        };
    }
}

class PdfDocument extends Document {
    public function render(): string {
        return 'PDF content';
    }
}

class HtmlDocument extends Document {
    public function render(): string {
        return 'HTML content';
    }
}

$doc = Document::create('pdf');
echo $doc->render(); // PDF content

Результат:

PDF content

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

Статические методы и цепочки вызовов (fluent interface)

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

Пример
class QueryBuilder {
    private array $parts = [];

    public static function table(string $table): self {
        $qb = new self();
        $qb->parts['from'] = "FROM $table";
        return $qb;
    }

    public function where(string $condition): self {
        $this->parts['where'] = "WHERE $condition";
        return $this;
    }

    public function get(): string {
        $sql = 'SELECT * ' . ($this->parts['from'] ?? '');
        if (isset($this->parts['where'])) {
            $sql .= ' ' . $this->parts['where'];
        }
        return $sql;
    }
}

$sql = QueryBuilder::table('users')
    ->where('age > 18')
    ->get();
echo $sql;

Результат:

SELECT * FROM users WHERE age > 18

Использование статического метода с константами класса

Константы класса также являются статическими по умолчанию. Их можно использовать внутри статических методов.

Пример
class Config {
    public const VERSION = '1.0';
    public static function getVersion(): string {
        return 'Current version: ' . self::VERSION;
    }
}
echo Config::getVersion();

Результат:

Current version: 1.0

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

Анонимные классы тоже могут содержать статические методы.

Пример
$helper = new class {
    public static function greet($name) {
        return "Hello, $name!";
    }
};
echo $helper::greet('World');

Результат:

Hello, World!

Статические методы с типизацией и строгими типами

Рекомендуется указывать типы параметров и возвращаемые значения для статических методов.

Пример
declare(strict_types=1);

class Calculator {
    public static function add(int $a, int $b): int {
        return $a + $b;
    }
}
echo Calculator::add(3, 4); // 7
// echo Calculator::add(3, '4'); // TypeError в strict_types

Результат:

7

Ошибка: передача строки вместо числа в строгом режиме вызывает TypeError. Решение: всегда проверять типы входящих данных.

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

En
Php static method (php)