abstract class/static method ==> Vererbung klappt nicht
Eddie
- programmiertechnik
Hallo allerseits,
ich habe eine abstrakte Klasse, die eine statische Methode vererbt. Das geht auch so weit, nur der Zugriff auf die Eigenschaften klappt nicht!
So ungefaehr muss man sich das vorstellen:
abstract class super
{
static private $x = "Klappt nicht!!!";
static public function test()
{
return self::$x;
}
}
class sub extends super
{
static private $x = "Hallo Welt";
}
echo sub->test();
Da bekomme ich als Ergebnis "Klappt nicht!!!". Ich hätte aber lieber "Hallo Welt". Lässt sich das irgendwie lösen?
Danke für eure Hilfe,
Eddie
echo $begrüßung;
echo sub->test();
Das ist ein Syntaxfehler. sub ist ein Klassenname, keine Instanz. Es ist nur möglich, mit :: auf test() zuzugreifen.
Da bekomme ich als Ergebnis "Klappt nicht!!!". Ich hätte aber lieber "Hallo Welt". Lässt sich das irgendwie lösen?
Vermutlich mit Late Static Bindings. Probieren kann ich es nicht, denn das gibt es erst ab PHP-Version 5.3, was erst zwischen Mitte September und Mitte Oktober erscheinen soll.
echo "$verabschiedung $name";
Hallo dedlfix,
echo sub->test();
Äh, ja klar, Schwachsinn.
Vermutlich mit Late Static Bindings. Probieren kann ich es nicht, denn das gibt es erst ab PHP-Version 5.3, was erst zwischen Mitte September und Mitte Oktober erscheinen soll.
Ok, perfekt, danke!
Bis dahin hab ich's ganz fies gelöst:
abstract class super
{
static private $x = "Klappt nicht!!!";
static public function doWhatYouDo($str_caller)
{
return eval('return '.$str_caller.'::$x;');
}
}
class sub extends super
{
static private $x = "Hallo Welt";
static public function test()
{
// Vererbung funktioniert leider mit static NOCH nicht
// Abhilfe: "Late static bindings" ab PHP 5.3
// ==> http://de.php.net/manual/en/language.oop5.late-static-bindings.php
return parent::doWhatYouDo(__CLASS__);
}
}
echo sub::test();
Nunja, es funktioniert...
Eddie
Hallo dedlfix,
Da bekomme ich als Ergebnis "Klappt nicht!!!". Ich hätte aber lieber "Hallo Welt". Lässt sich das irgendwie lösen?
Vermutlich mit Late Static Bindings. Probieren kann ich es nicht, denn das gibt es erst ab PHP-Version 5.3, was erst zwischen Mitte September und Mitte Oktober erscheinen soll.
Auf http://snaps.php.net/ gibt's aktuelle Nightly-Snapshots der 5.3 (auch als Binärpakete - inklusive Windows-Installer) - außerdem gab's bereits Alpha 1 und Alpha 2.
Zu den weiteren Änderungen in 5.3 siehe auch http://wiki.php.net/doc/scratchpad/upgrade/53 + verlinkte Seiten.
Viele Grüße,
Christian