self:: vs className:: inside статические методы className в PHP

Я думаю, что не может быть никакой разницы, кроме личных предпочтений, но при чтении различного PHP-кода я сталкиваюсь с обоими способами доступа к классу методов.

Какая разница:

class Myclass
{
    public static $foo;

    public static function myMethod ()
    {
        // between:
        self::$foo;
        // and
        MyClass::$foo;
    }
}

2 ответа

Решение

(Примечание: в первоначальной версии сказано, что различий не было. На самом деле есть)

Разница действительно небольшая. 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

С self вы можете использовать его внутри класса, а с помощью "MyClass", как и у вас, вы можете ссылаться на него внешне:

$instance = new Myclass();
$variable = $instance::$foo
Другие вопросы по тегам