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

В чем отличие self и static?

2.0 Middle🔥 221 комментариев
#PHP Core#ООП

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

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

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

В чем отличие self и static?

Основные различия

self и static — это оба ключевых слова для доступа к статическим свойствам и методам класса, но они работают по-разному в контексте наследования. Это различие особенно важно при работе с полиморфизмом и вызовом методов из дочерних классов.

self — позднее связывание (Late Static Binding) отсутствует

self всегда указывает на класс, в котором оно было написано. Оно не учитывает наследование и переопределение методов в дочерних классах.

class Parent {
    public static function whoAmI() {
        return "Parent";
    }

    public static function test() {
        echo self::whoAmI(); // Всегда вызовет Parent::whoAmI()
    }
}

class Child extends Parent {
    public static function whoAmI() {
        return "Child";
    }
}

Child::test(); // Выведет: Parent

static — позднее статическое связывание (Late Static Binding)

static разрешает имена в контексте того класса, который фактически был вызван, что позволяет правильно работать с переопределенными методами в дочерних классах.

class Parent {
    public static function whoAmI() {
        return "Parent";
    }

    public static function test() {
        echo static::whoAmI(); // Вызовет whoAmI() класса, который был вызван
    }
}

class Child extends Parent {
    public static function whoAmI() {
        return "Child";
    }
}

Child::test(); // Выведет: Child

Практический пример с Factory Pattern

class Database {
    public static function getInstance() {
        return new static(); // Используем static для гибкости
    }
}

class PostgreSQL extends Database {
    public static function getInstance() {
        return new static(); // Вернет экземпляр PostgreSQL
    }
}

$db = PostgreSQL::getInstance(); // instanceof PostgreSQL

Рекомендации

  • Используй static — это лучший выбор для современного PHP кода, так как он поддерживает полиморфизм и наследование
  • self — используй, только если ты точно хочешь обратиться именно к этому классу, не к переопределённым версиям
  • Для свойств — поведение аналогично: static позволит переопределить свойство в дочернем классе, self всегда вернет значение из исходного класса

Вывод: static — это более гибкий и мощный механизм, который правильно работает с наследованием и полиморфизмом.