Статичные функции класса: синтаксис и примеры в PHP
Статические методы в PHP: все, что нужно знать
Основное решение для вызова методов без создания экземпляра класса - объявление метода с ключевым словом static. Такие методы принадлежат классу, а не объекту, и доступны через имя класса или через переменную класса. Наиболее эффективное применение - утилитарные классы (например, валидаторы, хелперы), где не требуется хранить состояние, а также реализация паттернов Singleton или Factory.
class MathHelper {
public static function square($num) {
return $num * $num;
}
}
echo MathHelper::square(5); // 25Php 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(); // ChildClassPhp 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:56Include 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. Решение: всегда проверять типы входящих данных.