Christopher: abstract static function != OOP

Hallo,

ich habe eine abstrakte Basisklasse, die zum einen bestimmte abstrakte Methoden deklariert - und zum anderen eigene Logik beinhaltet. Einige Funktionen benoetigen jedoch Werte aus den einzelnen Klassen, welche diese abstrakte Basisklasse mittels extends als Superclass nutzen.

  
abstract class AbsBase {  
 public abstract function DoSth();  
 public function DoMore() {  
  $this->DoSth();  
  echo "!";  
 }  
}  
class MyClass extends AbsBase {  
 public function DoSth() { echo "ja"; }  
}  
  
$MyClass = new MyClass;  
$MyClass->DoSth(); // output: ja  
$MyClass->DoMore(); // output: ja!  

Das obige Beispiel funktioniert wie gewuenscht.
Nun unterliege ich jedoch aus bestimmten Gruenden der Tatsache, dass einige Methoden statischer Natur sein sollten. Und an dieser Stelle fangen dann bei mir die Verstaednisprobleme an. Ich verstehe nicht, warum OOP (im Allgemeinen) mir das nicht erlaubt.

  
abstract class AbsBase {  
 public static abstract function DoSth();  
 public static function DoMore() {  
  self::DoSth();  
  echo "!";  
 }  
}  
class MyClass extends AbsBase {  
 public static function DoSth() { echo "ja"; }  
}  
  
MyClass::DoSth(); // output: ja  
MyClass::DoMore(); // eror: Fatal error: Cannot call abstract method AbsBase::DoSth()  

Mein Frage, gibt es hierfuer ein anderes Konzept, um eine aehnliche Struktur zu implementieren? Oder kann mir einer sagen warum das Konzept niemals funktionieren kann (auch Java, C#, etc..) und welche Alternativen ich diesbezueglich habe?

Danke Sehr
Christopher

  1. Hallo,

    MyClass::DoSth(); // output: ja
    MyClass::DoMore(); // eror: Fatal error: Cannot call abstract method AbsBase::DoSth()
    [/code]

    Mein Frage, gibt es hierfuer ein anderes Konzept, um eine aehnliche Struktur zu implementieren?

    Du hast zwei Möglichkeiten:

    a) Auf PHP 5.3 zu warten (Stichwort late static binding)
           Dort ist dann das möglich, was Du willst
     b) Einen Singleton-Pattern für jedes der Unterokbjekte zu implementieren

    Viele Grüße,
    Christian

    1. Hallo Christian,

      zuerst einmal freut es mich zu hoeren, dass es tatsaechlich Anwendungsfaelle gibt, in denen so ein Late-Static-Binding Sinn macht - andererseits wuerde es die Neuerung schliesslich nicht geben. Folglich muss ich nicht an mir selbst zweifeln. Das hat schon mal was Gutes.

      a) Auf PHP 5.3 zu warten (Stichwort late static binding)

      Herrlich. Doch schade, dass "stable release around the end of Q1 2009"

      b) Einen Singleton-Pattern für jedes der Unterokbjekte zu implementieren

      Hmm..ja, aber das ist m.M.n. ein wenig "von Hinten durch die Brust".

      Danke fuer deine Antwort!

      mfg
      Christopher