Ответ 1
(Примечание: в исходной версии указано, что нет разницы. На самом деле есть)
Есть действительно небольшое различие. 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