self :: vs className :: внутри статических методов className в PHP

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

В чем разница:

class Myclass
{
    public static $foo;

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

Ответы

Ответ 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

Ответ 2

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

$instance = new Myclass();
$variable = $instance::$foo