(Примечание: в первоначальной версии говорилось, что разницы нет. На самом деле, есть)
Разница действительно небольшая.self::
перенаправляет статические вызовы, а className::
- нет.Это имеет значение только для поздних статических привязок в PHP 5.3 +.
При статических вызовах PHP 5.3+ запоминает первоначально вызванный класс.Использование className::
заставляет PHP «забыть» это значение (т.е. сбрасывает его до className
), в то время как self::
сохраняет его.Рассмотрим:
<?php
class A {
static function foo() {
echo get_called_class();
}
}
class B extends A {
static function bar() {
self::foo();
}
static function baz() {
B::foo();
}
}
class C extends B {}
C::bar(); //C
C::baz(); //B