self ссылается на текущий класс на этапе компиляции (compile time), а static ссылается на класс, который был вызван в момент выполнения (runtime). Это особенно важно при работе с наследованием и поздним статическим связыванием.
Пример с self:
php
Пример с static (позднее статическое связывание):
php
Разница заключается в том, как определяется конечный класс, метод которого будет вызван. self "закрепляется" на этапе компиляции за классом, в котором он написан. static позволяет отложить определение до выполнения, используя класс, из которого был сделан вызов.
Таблица для сравнения:
| Особенность | self | static (Позднее статическое связывание) |
|---|---|---|
| Время связывания | Compile time (на этапе компиляции) | Runtime (на этапе выполнения) |
| Ссылка на класс | Класс, в котором написано self:: | Класс, который был вызван |
| Поведение при наследовании | Не учитывает переопределение в дочерних классах | Учитывает переопределение в дочерних классах |