Letztens hatte ich folgedes Problem:

Ich hatte eine von mehreren Projekten benutzte Basisklasse „Class_A“. Diese sollte ein Objekt benutzen, welches von einer projektspezifischen statischen Cache-Klasse gebaut wird. Um nun dieses Objekt in der Basisklasse benutzen zu können sollte eine weitere, in beiden benutzte, von der Klasse „Class_A“ abgeleitete, abstrakte Klasse „Class_A_A“ eine statische Methode „method_B“ bekommen.

myObject = Class_A_A::method_B();
  }
}

abstract class Class_A_A extends Class_A
{
  public static method_B()
  {
    return null //oder exception werfen
  };
}
?>

Die von der Klasse „Class_A_A“ abgeleiteten entgültigen, projekspezifischen Klassen Class_Projekt1_A_A“ und „Class_Projekt2_A_A“ sollten diese statische Methode „method_B überschreiben und das Objekt aus dem jeweiligen projektspezifischen Cache bauen und zurückgeben. Dieses könnte dann wie gewünscht in der Basisklasse „Class_A“ benutzt werden. Genau genommen wollte ich also eine aufgerufene Klasse in dem Kontext seiner statischern Vererbung referenzieren.

foo();
}

class Class_Projekt2_A_A extends Class_A_A
{
  public static method_B()
  {
    return CacheFromProjekt2::->foo();
  };
}
?>

Der Aufruf von Class_A_A::method_B() aus der Klasse „Class_A“ herraus lieferte allerdings überhaupt nicht das gewünschte. Anstelle des Objekts habe ich nichts zurückbekommnen, da wohl der Methodenaufruf nicht wie gewünscht zur Laufzeit in z.B. Class_Projekt1_A_A::method_B() aufgelößt wird . Statische Methoden scheinen also über die Klasse aufgelöst zu werden, in denen sie definiert sind. Laufzeitspezifische Ableitungen statischer Methoden („Späte statische Bindungen“) scheinen keine Rolle zu spielen.

Also habe ich ein wenig gegooglt und herrausgefunden, dass meine gewünschte „Späte statische Bindung“ erst ab PHP version 5.3.0 unterstützt wird. Leider aber bietet mein Provider im Moment nur PHP 5.2.9 an :(.

Wenn das aber so weit ist, dann könnte ich der Klasse „Class_A_A“ eine weitere statische Methode „method_external_B()“ geben welche die eigene Methode method_B() mit Hilfe des Schlüsselworts „static“ aufruft. Also „static::method_B()“

myObject = Class_A_A::method_external_B();
  }
}

abstract class Class_A_A extends Class_A
{
  public static method_B()
  {
    return null; //oder exception werfen
  };

  public static method_external_B()
  {
    return static::method_B();
  };
}
?>

Jetzt heißt es also warten auf den Hoster und hoffen auf die Unterstützung von PHP 5.3