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
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.
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
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