Статические свойства и методы
Используйте статические члены и разбирайтесь, когда их можно вызывать без экземпляра
«Статические свойства и методы» — бесплатный урок PHP Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.
Введение: статические свойства и методы
Статические члены принадлежат самому классу, а не отдельному экземпляру. Обращайтесь к ним с помощью ClassName::member или self:: внутри класса. Они являются общими для всех экземпляров.
Основные понятия
Ключевые понятия статических свойств и методов:
- Объявляются с помощью ключевого слова
static - Доступ выполняется с помощью
::(оператора разрешения области видимости) self::используется внутри класса, аClassName::— за его пределами- Позднее статическое связывание выполняется с помощью
static::
Статическое свойство
Пример:
<?php
class AppConfig {
private static array $settings = [];
public static function set(string $key, mixed $val): void {
self::$settings[$key] = $val;
}
public static function get(string $key, mixed $default = null): mixed {
return self::$settings[$key] ?? $default;
}
}
AppConfig::set('debug', true);
echo AppConfig::get('debug') ? 'debug on' : 'debug off';Статический метод
Продолжение:
<?php
class MathHelper {
public static function clamp(float $v, float $min, float $max): float {
return max($min, min($max, $v));
}
public static function lerp(float $a, float $b, float $t): float {
return $a + ($b - $a) * $t;
}
}
echo MathHelper::clamp(150, 0, 100); // 100
echo MathHelper::lerp(0, 100, 0.5); // 50Шаблон одиночки
Практика:
<?php
class Database {
private static ?Database $instance = null;
private function __construct() {
echo 'Connected to DB';
}
public static function getInstance(): self {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
}
$db1 = Database::getInstance(); // 'Connected to DB'
$db2 = Database::getInstance(); // no output — same instance
echo ($db1 === $db2) ? 'same' : 'different'; // sameСтатический счётчик
Подробнее:
<?php
class EventEmitter {
private static int $instanceCount = 0;
public function __construct() {
self::$instanceCount++;
}
public static function count(): int {
return self::$instanceCount;
}
}
new EventEmitter();
new EventEmitter();
new EventEmitter();
echo EventEmitter::count(); // 3Позднее статическое связывание
Расширенное использование:
<?php
class ParentClass {
public static function create(): static {
return new static(); // resolves to calling subclass
}
public function getClass(): string {
return static::class; // late static binding
}
}
class ChildClass extends ParentClass {}
$obj = ChildClass::create();
echo $obj->getClass(); // ChildClassСтатическая фабрика
Практический шаблон:
<?php
class Response {
private function __construct(
private int $status,
private mixed $body
) {}
public static function ok(mixed $data): self {
return new self(200, $data);
}
public static function notFound(): self {
return new self(404, ['error' => 'Not Found']);
}
public function toJson(): string {
return json_encode(['status' => $this->status, 'body' => $this->body]);
}
}
echo Response::ok(['users' => []])->toJson();Статические и обычные члены: компромиссы
Рекомендации:
<?php
// Static: no object needed, but harder to test/mock
class Validator {
public static function isEmail(string $s): bool {
return (bool) filter_var($s, FILTER_VALIDATE_EMAIL);
}
}
// Instance: injectable dependency, testable
class ValidatorService {
public function isEmail(string $s): bool {
return (bool) filter_var($s, FILTER_VALIDATE_EMAIL);
}
}
// Prefer instance classes in larger applicationsПрактический шаблон
Объединим всё в практическом шаблоне для статических свойств и методов.
Распространённые ошибки
Избегайте этих распространённых ошибок при работе со статическими свойствами и методами:
- Статические члены являются общими для всех экземпляров
- В наследуемых классах отдавайте предпочтение позднему статическому связыванию (static::), а не self::
- Одиночки — распространённый, но иногда чрезмерно используемый шаблон
- Статические методы сложнее имитировать в модульных тестах
Быстрая проверка
Какое ключевое слово обращается к статическому свойству внутри класса с учётом наследования (позднего статического связывания)?
Итоги: статические свойства и методы
Вы изучили статические свойства и методы. Запомните основные моменты:
- Статические члены являются общими для всех экземпляров
- В наследуемых классах отдавайте предпочтение позднему статическому связыванию (static::), а не self::
- Одиночки — распространённый, но иногда чрезмерно используемый шаблон
- Статические методы сложнее имитировать в модульных тестах
Часто задаваемые вопросы
Урок «Статические свойства и методы» бесплатный?
Да — полный текст урока «Статические свойства и методы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.
Чему я научусь в уроке «Статические свойства и методы»?
Используйте статические члены и разбирайтесь, когда их можно вызывать без экземпляра Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать PHP Academy?
Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Статические свойства и методы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке PHP Academy?
Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Классы, свойства и методы
- Конструкторы и деструкторы
- Статические свойства и методы
- Обзор магических методов