Комментарии (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 — это более гибкий и мощный механизм, который правильно работает с наследованием и полиморфизмом.