Właściwości statyczne a dziedziczenie

Wpis napisany 23 lipca 2008 w kategoriach: PHP/MySQL, Techblog, Wszystkie | 23:15:30 | 22 komentarze

Ostatnio dostałem do swoich rąk pewną klasę która miała za zadania zarządzać zasobami w Orodlinie (swoją drogą, jestem tam programista - nie pisałem o tym jeszcze na blogu). Całość składała się z abstrakcyjnej klasy, po której dziedziczyć mają pozostałe odpowiedzialne za zasoby różnych jednostek (osoba, klan, w przyszłości może coś innego). W klasie tej zdefiniowana jest lista wszystkich dostępnych w grze zasobów. Niestety, byłoby zbyt pięknie, gdyby każdy podmiot miał takie same zasoby. Różnice są niewielkie, jednak podczas pisania trzeba wziąć je pod uwagę.

Twórca klasy bazowej rozwiązał to w banalny sposób, dodając różniące się kawałki w konstruktorze klasy dziedziczącej. I wszystko działało, gdybym nie dodał kolejnej takiej klasy.

Okazało się, że klasa mojego poprzednika dodaje do mojej swoje własne zasoby! Przez to nie tylko miałem za dużo danych w zapytaniu SQL które było przez nią generowane, ale zwyczajnie nie mogłem go wykonać!

Co się okazało? PHP jest tak dziwnym językiem, że gdy dziedziczę statyczną właściwość to wszelkie zmiany wykonane na niej są stosowane do obiektu nadrzędnego. I vice versa. Rozwiązanie? Banalne w swojej prostocie - zdefiniować właściwość statyczną w klasie dziedziczącej.

Teraz nieco przykładów:

<?php
class Mother
{
	public static $var = 1;
}
 
class ChildOne extends Mother 
{
 
}
 
class ChildTwo extends Mother 
{
	public static $var = 2;
}
echo Mother::$var; //1
echo ChildOne::$var; //1
echo ChildTwo::$var; //2
 
ChildOne::$var = 5;
ChildTwo::$var = 6;
 
echo Mother::$var; //5 (!)
echo ChildOne::$var; //5
echo ChildTwo::$var; //6
?>

Może nie jestem specjalistą, ale takie zachowanie według wszelkiej logiki jest dla mnie po prostu dziwne. Tym bardziej, że w swoim skrypcie korzystałem z tych zmiennych wewnątrz klas, a co za tym idzie powoływałem się na nie poprzez self:: zamiast parent::.

Są takie chwile, gdy programowanie naprawdę mnie dobija. Szukanie takich bubli, które powinny być jasno zaznaczone w dokumentacji, naprawdę denerwuje. Że już o dziwnych zachowaniach PHP i jego brakach nie wspomnę... Ale co zrobić, skoro popularne i dobrze je poznałem? A wam zdarzają się takie dziwne sytuacje z poszukiwaniami błędów? Czekam na komentarze.

© Powered by JoggerPL and Albi