← Назад к вопросам

Что такое Static?

1.0 Junior🔥 142 комментариев
#ООП

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Static в PHP?

Ключевое слово static в PHP имеет несколько значений и используется в разных контекстах, но все они связаны с концепцией «статичности» — то есть, принадлежности не к конкретному экземпляру объекта, а к классу в целом или с сохранением состояния между вызовами.


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

Это основное использование static в объектно-ориентированном программировании (ООП) на PHP.

Статические свойства

Это переменные, которые принадлежат самому классу, а не его экземплярам (объектам). Они общие для всех объектов класса. В памяти существует только одна копия статического свойства.

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

Это функции, которые также принадлежат классу, а не объекту. Их можно вызывать без создания экземпляра класса. Внутри статического метода нельзя использовать $this, так как нет привязки к конкретному объекту.

class Counter {
    public static int $count = 0; // Статическое свойство
    
    public function __construct() {
        self::$count++; // Увеличиваем счетчик при каждом новом объекте
    }
    
    public static function getCount(): int {
        return self::$count; // Статический метод возвращает значение
    }
}

// Использование без создания объекта:
echo Counter::getCount(); // 0

$obj1 = new Counter();
$obj2 = new Counter();

echo Counter::getCount(); // 2
echo $obj2::$count; // 2 (можно обратиться и через объект, но не рекомендуется)

Ключевые особенности:

  • Обращение через оператор :: (Paamayim Nekudotayim).
  • Для доступа к статическим членам изнутри класса используют ключевые слова self::, static:: (для позднего статического связывания) или parent::.
  • Часто используются для утилитарных функций (например, Math::sqrt()), фабричных методов, счетчиков, кешей или конфигураций.

2. Позднее статическое связывание (Late Static Binding - LSB)

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

class ParentClass {
    public static function who() {
        echo __CLASS__;
    }
    
    public static function testSelf() {
        self::who(); // Всегда вызовет ParentClass::who()
    }
    
    public static function testStatic() {
        static::who(); // Вызовет who() у того класса, из которого был вызван testStatic()
    }
}

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

ChildClass::testSelf(); // Выведет: ParentClass
ChildClass::testStatic(); // Выведет: ChildClass (Позднее связывание!)

Здесь static:: создает ссылку на класс, который был инициирован во время выполнения, что является основой для многих шаблонов проектирования, например, Active Record.


3. Статические переменные внутри функций

Переменная, объявленная как static внутри функции, сохраняет свое значение между вызовами этой функции. Область видимости переменной остается локальной для функции, но время жизни становится глобальным для всего скрипта.

function increment() {
    static $counter = 0; // Инициализация происходит только при первом вызове
    $counter++;
    echo $counter;
}

increment(); // 1
increment(); // 2
increment(); // 3
// Переменная $counter здесь недоступна

Это полезно для кеширования результатов, создания генераторов уникальных ID или простого подсчета вызовов.


4. Анонимные функции (замыкания)

В замыканиях, созданных внутри метода класса, static используется для запрета автоматической привязки ($this) к объекту, в контексте которого функция была создана. Это делает замыкание статическим.

class Foo {
    public function getClosure() {
        return static function() {
            // У этой функции НЕТ доступа к $this
            // return $this->property; // Фатальная ошибка
        };
    }
}

Итог и ключевые различия

КонтекстНазначениеКлючевая фраза
Свойства/методы классаПринадлежат классу, а не объекту. Общая память.public static $var;, Class::method()
Позднее статическое связываниеДинамическое разрешение класса при наследовании.static::method() вместо self::method()
Локальная переменная в функцииСохранение значения между вызовами функции.function foo() { static $cache; }
Анонимная функцияЗапрет автоматической привязки $this.$func = static fn() => ...;

Главный принцип: static всегда указывает на что-то, что не привязано к конкретному экземпляру объекта — либо живет в контексте класса, либо сохраняется между вызовами, либо определяется в момент выполнения. Понимание этих нюансов критически важно для написания корректного, поддерживаемого кода на PHP, особенно при работе с наследованием и сложными архитектурами.