czy dostanę te same wyniki?
Nie całkiem. Nie znam jednak obejścia dla PHP 5.2.
Jaka jest różnica między new self
i new static
?
self
odnosi się do tej samej klasy, w której new
słowo kluczowe jest faktycznie zapisane.
static
, w późnych wiązaniach statycznych PHP 5.3, odnosi się do dowolnej klasy w hierarchii, w której wywołałeś metodę.
W poniższym przykładzie B
dziedziczy obie metody A
. self
Inwokacja jest związany A
, ponieważ jest zdefiniowana w A
„s realizacji pierwszego sposobu, natomiast static
jest zobowiązany do zwanej klasy (patrz również 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
get_called_class()
, co jest faktycznie takie samo jak__CLASS__
, ale zgodne z LSB.self
zwróci się istatic
zwróci coś, czego nie można zastąpić ... Ale oto jest odwrotnie. Nigdy nie przestaję być pod wrażeniem nazewnictwa, konwencji i ogólnego stylu PHP. -_-Jeśli metoda tego kodu nie jest statyczna, możesz obejść ten problem w 5.2, używając
get_class($this)
.Wyniki:
źródło
clone
, ale tylko przez ponowne utworzenie i ustawienie właściwości.$copy = new static(); $copy->set($this->get()); return $copy;
self::
lubstatic::
będzie mieć wpływ na to, czy używana jest wersja tej metody statycznej klasy podstawowej lub podklasy. Wobec braku jakiegoś powodu, by sądzić, że taka sytuacja z natury wskazuje na złą praktykę (i nie widzę żadnego powodu, dla którego powinna tak być), wybór pomiędzyself::
istatic::
jest równie istotny w przypadku metod niestatycznych, jak w przypadku metody statyczne. Czy źle zrozumiałem twój komentarz, czy jest to po prostu błąd?Oprócz odpowiedzi innych:
Oznacza to, że nie można użyć
static::
we właściwości klasy, ponieważ wartości właściwości:Za pomocą
self::
źródło
public $name = static::class;
, a nie w linii 7, jak sugeruje to przykład. Błąd mówi: „statyczne :: class nie może być użyte do rozpoznawania nazw klas w czasie kompilacji”, co oznacza, że problemem nie jest próba uzyskania dostępu do pola $ name, ale znacznie wcześniej przy kompilacji klasy PHP. Linia 7 (lub 6) nie zostanie osiągnięta w pierwszym przykładzie.