Czym dokładnie są późne wiązania statyczne w PHP?
źródło
Czym dokładnie są późne wiązania statyczne w PHP?
Zdecydowanie musisz przeczytać Late Static Bindings w podręczniku PHP. Spróbuję jednak krótko podsumować.
Zasadniczo sprowadza się to do tego, że self
słowo kluczowe nie podlega tym samym regułom dziedziczenia. self
zawsze odnosi się do klasy, w której jest używany. Oznacza to, że jeśli utworzysz metodę w klasie nadrzędnej i wywołasz ją z klasy potomnej, self
nie będzie odnosić się do dziecka, jak można by się tego spodziewać.
Późne wiązanie statyczne wprowadza nowe użycie static
słowa kluczowego, które rozwiązuje tę konkretną wadę. Kiedy używasz static
, reprezentuje klasę, w której używasz go po raz pierwszy, tj. „wiąże się” z klasą wykonawczą.
To są dwie podstawowe koncepcje, które za tym stoją. Droga self
, parent
i static
działa, gdy static
jest w grze może być subtelna, więc zamiast iść do bardziej szczegółowo, bym zdecydowanie zaleca się badać ręcznych przykłady stron. Kiedy zrozumiesz podstawy każdego słowa kluczowego, przykłady są niezbędne, aby zobaczyć, jakie wyniki uzyskasz.
self
słowo kluczowe nie jest zgodne z regułami dziedziczenia.self
zawsze jest przypisywane do klasy, w której zostało użyte.” - Co nie oznacza, że nie można wywołać statycznej metody rodzica z obiektu podrzędnego za pośrednictwemself
, tak jak w przypadku metod niestatycznych. Może masz na myśli właściwą rzecz, ale powinieneś to przeformułować. To wszystko ma znaczenie tylko wtedy, gdy dzieci mają identyczne nazwy członków, ponieważ możesz zdecydować, do których z nich się odwoływać, używającstatic::
zamiast tego.Z PHP: Late Static Bindings - Manual :
Zobaczmy przykład:
źródło
Nie ma zbyt oczywistego zachowania:
Poniższy kod tworzy „alphabeta”.
Jeśli jednak usuniemy deklarację funkcji classname z klasy beta, otrzymamy jako wynik „alphaalpha”.
źródło
Cytuję z książki: „PHP Master pisze nowatorski kod”.
Zapraszam również do zapoznania się z oficjalną dokumentacją php: http://php.net/manual/en/language.oop5.late-static-bindings.php
Najprostszym sposobem wyjaśnienia późnego wiązania statycznego jest prosty przykład. Przyjrzyj się dwóm definicjom klas poniżej i czytaj dalej.
Widzimy klasę rodzica (pojazd) i klasę dziecka (samochód). Klasa nadrzędna ma 2 metody publiczne:
invokeDriveByStatic
invokeStopBySelf
Klasa nadrzędna ma również 2 prywatne metody:
drive
stop
Klasa Child przesłania dwie metody:
drive
stop
Teraz wywołajmy metody publiczne:
invokeDriveByStatic
invokeStopBySelf
Zadaj sobie pytanie: która klasa wywołuje
invokeDriveByStatic
/invokeStopBySelf
? Klasa rodzica czy dziecka?Spójrz poniżej:
Słowo
static
kluczowe jest używane we wzorcu projektowym Singleton. Zobacz link: https://refactoring.guru/design-patterns/singleton/php/exampleźródło
Najprostszy przykład pokazujący różnicę.
Uwaga, self :: $ c
Późne wiązanie statyczne, uwaga static :: $ c
źródło
Na przykład:
źródło
Patrząc na to z punktu „po co miałbym tego używać?” z perspektywy, jest to w zasadzie sposób na zmianę kontekstu, z którego metoda statyczna jest interpretowana / uruchamiana.
W
self
przypadku kontekstem jest ten, w którym pierwotnie zdefiniowano metodę. Zstatic
, to ten, z którego dzwonisz.źródło
Zwróć także uwagę na aktualizację zmiennych statycznych w klasach potomnych. Znalazłem ten (nieco) nieoczekiwany wynik, w którym dziecko B aktualizuje dziecko C:
Możesz to naprawić, deklarując tę samą zmienną w każdej klasie potomnej, na przykład:
źródło