PHP 5.3: Late Static Binding
Late static binding
Co by mówili jego przeciwnicy, PHP ciągle się rozwija i z wersji na wersję posiada coraz więcej ciekawych i przydatnych (zwykle) możliwości. Aktualna wersja PHP, czyli z rodziny 5.3, oprócz takich ciekawostek jak przestrzenie nazw (namespace), operator goto (ok, raz na milion linii kodu może się przydać ;]), czy funkcji anonimowych i domknięć, wprowadziło coś co wreszcie wyprostowało użycie metod i atrybutów statycznych: późne statyczne łączenie (Late Static Binding, LSB).
Ale zacznijmy od początku. Ponieważ jawne wywoływanie klasy w której zdefiniowana jest metoda statyczna wewnątrz tej klasy jest raczej mało wygodne, PHP udostępnia słowo kluczowe self. Umożliwia ono proste wywołanie metody (i atrybutu) statycznego wewnątrz klasy do której przynależy. Przykładowo:
Metoda fotel::echoMyName wywoła metodę statyczną fotel::getName() bez podawania nazwy klasy. Proste? Proste i eleganckie. Niestety, nie pozbawione wad, gdyż słowo kluczowe self wywołuje statyka należącego do tej samej klasy w której jest użyte. Nie uwzględnia dziedziczenia.Popatrzmy na kolejny przykład:
Wbrew temu co może się wydawać, metoda fotelBujany::echoMyName() nie zwróci ‘Jestem fotelem bujanym’. Dla słowa kluczowego self nie ma znaczenia, że metoda fotel::getName() została nadpisana w klasie fotelBujany. Self jest użyte w klasie fotel, więc wywoła metodę getName() przynależną do tej klasy, a więc fotel::getName(). Kłopot? Kłopot. Takie działanie self powoduje, że dziedziczenie w przypadku metod i atrybutów statycznych w PHP jest co najmniej kulawe. Niby można stosować obejścia, ale to tylko półśrodek.
Na szczęście, PHP 5.3 udostępnia nowy mechanizm: późne statyczne łączenie (Late Static Binding) uwzględniające dziedziczenie metod i atrybutów statycznych. Jest ono realizowane przez słowo kluczowe static. Popatrzmy na ostatni przykład:
Jak widać, jedyną różnicą w kodzie, jest użycie static zamiast self w metodzie fotel::echoMyName(). I tym razem, wywołanie metody fotelBujany::echoMyName() działa dokładnie tak, jak można się tego spodziewać: wyświetla ‘Jestem fotelem bujanym’.
Fajne? Fajne! Przydatne? Jak najbardziej!