0Pricing
PHP Academy · Урок

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

Используйте статические члены и разбирайтесь, когда их можно вызывать без экземпляра

«Статические свойства и методы» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Классы, свойства и методы
  2. Конструкторы и деструкторы
  3. Статические свойства и методы
  4. Обзор магических методов
← Назад к PHP Academy