self:: vs className:: inside static className methods in PHP

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

В чем есть разница:

class Myclass
{
    public static $foo;

    public static function myMethod ()
    {
        // between:
        self::$foo;
        // and
        MyClass::$foo;
    }
}
16
задан Cœur 16 June 2019 в 13:57
поделиться

2 ответа

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

Действительно, есть небольшая разница. self:: перенаправляет статические вызовы, а className::: - нет. Это имеет значение только для поздних статических привязок в PHP 5.3+.

В статических вызовах PHP 5.3+ запоминает первоначально вызванный класс. Использование className:: заставляет PHP "забыть" это значение (т.е. сбрасывает его на className), в то время как self:: сохраняет его. Consider:

<?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
35
ответ дан 30 November 2019 в 16:49
поделиться

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

$instance = new Myclass();
$variable = $instance::$foo
1
ответ дан 30 November 2019 в 16:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: