В чем разница между self::$bar и static::$bar в PHP? [дубликат]


Возможные Дубликаты:
новое я против нового статического

в чем разница между использованием self и static в примере ниже?

class Foo
{
    protected static $bar = 1234;

    public static function instance()
    {
        echo self::$bar;
        echo "n";
        echo static::$bar;
    }

}

Foo::instance();

производит

1234
1234
2 85

2 ответа:

при использовании self чтобы обратиться к члену класса, вы ссылаетесь на класс, в котором вы используете ключевое слово. В этом случае, ваш Foo класс определяет защищенное статическое свойство с именем $bar. Когда вы используете self на Foo класс для ссылки на свойство, вы ссылаетесь на тот же класс.

поэтому, если вы пытались использовать self::$bar в любом месте Foo класс а Bar класс с другим значением для свойства, он будет использовать Foo::$bar вместо Bar::$bar, что может быть не то, что вы намереваетесь:

class Foo
{
    protected static $bar = 1234;
}

class Bar extends Foo
{
    protected static $bar = 4321;
}

при использовании static, вы вызываете функцию, называемую позднего статического связывания (введено в PHP 5.3).

в приведенном выше сценарии, используя static вместо self в результате Bar::$bar используется вместо Foo::$bar, потому что интерпретатор затем принимает во внимание повторное объявление в Bar класса.

обычно используется поздняя статика привязки для методов или даже самого класса, а не свойства, поскольку вы не часто повторно объявляете свойства в подклассах; пример использования static ключевое слово для вызова конструктора с поздней привязкой можно найти в этом связанном вопросе:новое я против нового статического

однако, это не исключает использования static свойства, а также.

self - refers to the same class whose method the new operation takes place in.

static - in PHP 5.3's late static binding refers to whatever class in the hierarchy which you call the method on.

в следующем примере (см. get_called_class ()), класс B наследует оба метода от класса A. Self привязан к A, потому что он определен в реализации метода A, тогда как static привязан к вызываемому классу, несмотря на то, что он также находится в реализации метода A.

class A {
    public static function get_A() {
        return new self();
    }

    public static function get_me() {
        return new static();
    }
}

class B extends A {}

echo get_class(B::get_A());  // A
echo get_class(B::get_me()); // B
echo get_class(A::get_me()); // A