Nisam siguran da li je vec bila slicna tema, ako jeste, izvinjavam se unapred.
Elem, izgubih, pa sta znam, dobrih - 30-60-90min, lupajuci glavu zasto ovaj kod:
Code (php):
class A
{
public static function getMe()
{
self::buildMe();
}
public static function buildMe()
{
echo "Building from Class A";
}
}
class B extends A
{
public static function buildMe()
{
echo "Building from Class B";
}
}
class A
{
public static function getMe()
{
self::buildMe();
}
public static function buildMe()
{
echo "Building from Class A";
}
}
class B extends A
{
public static function buildMe()
{
echo "Building from Class B";
}
}
Vraca ovakve rezultate:
Code (php):
A::getMe(); // "Building from class A" (ocekivano)
B::getMe(); // "Building from class A" (wtf ? lol !)
A::getMe(); // "Building from class A" (ocekivano)
B::getMe(); // "Building from class A" (wtf ? lol !)
Generalno, kao sto moze da se zakljuci, ono sto bi smo ocekivali da dobijemo kao rezultate - nazalsost ne dobijamo.
Zasto ? Hebo mater ... Uspeo sam cak da procitam da su drugari iz PHP-a cak to i obrazlozili - zasto to ne radi kako bi trebalo, itd itd. (nazalost, nisam uspeo da nadjem).
Nasao sam par workaround-a, od kojih je jedan tipa:
Code (php):
class A
{
public static function getMe($class = __CLASS__)
{
call_user_func(array($class, 'buildMe'));
}
public static function buildMe()
{
echo "Building from Class A";
}
}
class B extends A
{
public static function buildMe()
{
echo "Building from Class B";
}
}
class A
{
public static function getMe($class = __CLASS__)
{
call_user_func(array($class, 'buildMe'));
}
public static function buildMe()
{
echo "Building from Class A";
}
}
class B extends A
{
public static function buildMe()
{
echo "Building from Class B";
}
}
Kad se ovako odradi, onda su rezultati u redu:
Code (php):
A::getMe(); // "Building from class A" (ocekivano)
B::getMe(); // "Building from class B" (ocekivano)
A::getMe(); // "Building from class A" (ocekivano)
B::getMe(); // "Building from class B" (ocekivano)
Ali, opet, heh .... Izgleda odvratno, posebno u slucaju kad metoda MORA da primi jedan ili vise parametara. Hebeno moram da napisem u komentarima - "Ni slucajno ne saljite poslednji parametar, ignorisite ga, on je tu samo zato sto je PHP glu.... gotivan :-)".
Misljenja ? Ideje ? :-)
Iskreno, mislim da cu pre da u kompletu prepisem metodu u klasi B, nego da se igram sa call_user_func() and friends ....
EDIT:
Zaboravih da navedem nekoliko zanimljivih izvora (na osnovu kojih sam srecom zakljucio da nisam poludeo, srecom):
http://socket7.net/article/php-5-static-and-inheritance
http://bugs.php.net/bug.php?id=42681
http://bugs.php.net/bug.php?id=28442