New self vs. new static
Konwertuję bibliotekę PHP 5.3 do pracy na PHP 5.2. Główną rzeczą stojącą mi na drodze jest użycie późnych wiązań statycznych, takich jak return new static($options);
, czy jeśli przekonwertuję to na return new self($options)
, uzyskam takie same wyniki?
Jaka jest różnica między new self
a new static
?
3 answers
Nie bardzo. Nie znam obejścia dla PHP 5.2.Czy dostanę takie same wyniki?
Jaka jest różnica między
new self
Anew static
?
self
odnosi się do tej samej klasy, w której słowo kluczowe new
jest rzeczywiście napisane.
static
, w późnych wiązaniach statycznych PHP 5.3 odnosi się do dowolnej klasy w hierarchii, na której wywołałeś metodę.
W poniższym przykładzie B
dziedziczy obie metody z A
. Wywołanie self
jest związane z A
, ponieważ jest zdefiniowane w A
implementacji pierwszej metody, podczas gdy static
jest związane z wywołaną klasą (Zobacz też get_called_class()
).
class A {
public static function get_self() {
return new self();
}
public static function get_static() {
return new static();
}
}
class B extends A {}
echo get_class(B::get_self()); // A
echo get_class(B::get_static()); // B
echo get_class(A::get_self()); // A
echo get_class(A::get_static()); // 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
2016-04-20 19:12:16
Jeśli metoda tego kodu nie jest statyczna, możesz uzyskać obejście w 5.2 używając get_class($this)
.
class A {
public function create1() {
$class = get_class($this);
return new $class();
}
public function create2() {
return new static();
}
}
class B extends A {
}
$b = new B();
var_dump(get_class($b->create1()), get_class($b->create2()));
Wyniki:
string(1) "B"
string(1) "B"
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-06-18 15:45:38
Oprócz odpowiedzi innych:
Wartość Static:: zostanie obliczona przy użyciu informacji runtime.
Oznacza to, że nie można używać static::
w właściwości klasy, ponieważ wartości właściwości:
Musi być możliwe do oceny w czasie kompilacji i nie może zależeć od informacji o czasie wykonania.
class Foo {
public $name = static::class;
}
$Foo = new Foo;
echo $Foo->name; // Fatal error
Using self::
class Foo {
public $name = self::class;
}
$Foo = new Foo;
echo $Foo->name; // Foo
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-08-24 09:07:04