Jaka jest różnica między self::$bar a static::$bar w PHP? [duplikat]

Możliwy duplikat:
New self vs. new static

Jaka jest różnica między użyciem self i static w poniższym przykładzie?

class Foo
{
    protected static $bar = 1234;

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

}

Foo::instance();

Produkuje

1234
1234
Author: Community, 2012-07-29

2 answers

Kiedy używasz self w odniesieniu do członka klasy, odnosisz się do klasy, w której używasz słowa kluczowego. W tym przypadku klasa Foo definiuje chronioną właściwość statyczną o nazwie $bar. Gdy używasz self w klasie Foo do odwoływania się do właściwości, odnosisz się do tej samej klasy.

Dlatego jeśli spróbujesz użyć self::$bar gdzie indziej w swojej klasie Foo, ale masz Bar klasę o innej wartości dla właściwości, użyje ona Foo::$bar zamiast Bar::$bar, co może nie bądź tym, co zamierzasz:

class Foo
{
    protected static $bar = 1234;
}

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

Kiedy używasz static, wywołujesz funkcję o nazwie late static bindings (wprowadzoną w PHP 5.3).

W powyższym scenariuszu użycie static zamiast self spowoduje użycie Bar::$bar zamiast Foo::$bar, ponieważ interpreter bierze pod uwagę redeklarację w klasie Bar.

Zazwyczaj używasz późnych wiązań statycznych dla metod lub nawet samej klasy, A Nie właściwości, ponieważ nie często redeclare właściwości w podklasach; przykład użycia słowa kluczowego static do wywołania konstruktora późnoobowiązkowego można znaleźć w tym powiązanym pytaniu: New self vs. new static

Nie wyklucza to jednak używania {[11] } również z właściwościami.

 147
Author: BoltClock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:51
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.

W poniższym przykładzie (Zobacz get_called_class () ), Klasa B dziedziczy obie metody z klasy A. Self jest powiązana z a, ponieważ jest zdefiniowana w implementacji metody a, podczas gdy static jest powiązana z wywołaną klasą pomimo faktu, że jest również w implementacji metody 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
 34
Author: Abid Hussain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-04 17:35:22