dedlfix: Klassenname von abgeleiteter Klasse in statischer Methode

Beitrag lesen

echo $begrüßung;

Ich möchte von der abstrakten Klasse Foo mehrere konkrete Klassen wie z.B. Bar1 ableiten. In der Klasse Foo soll später eine Fabrik dann über den Aufruf Bar1::getInstance() ein Objekt der Klasse Bar1 zurückgeben.

Meines Erachtens nach ist das ein "Missbrauch" des Fabrik-Musters (factory pattern). Eine Fabrik soll Produkte herstellen. Du hingegen versucht ein Produkt zu erhalten, welches zur Fabrik geht, um sich dort herstellen zu lassen.

Gibt es eine Möglichkeit, in der Methode Foo::getClassname den Namen der Unterklasse Bar1 zu erhalten, ohne diesen explizit aus jeder Unterklasse als Stringliteral zu übergeben?

Mal abgesehen von obigem Argument: mir fällt dazu keine Lösung ein. Füge mal ein

echo '<pre>';
  print_r(debug_backtrace());

in getClassName ein und du wirst feststellen, dass Bar1 ignoriert wird und statt dessen Foo::getClassname() direkt aufgerufen wird.

Beachte auch diese beiden Sätze im Handbuch-Kapitel Static Keyword unterhalb Classes and Objects (PHP 5).

"In fact static method calls are resolved at compile time. When using an explicit class name the method is already identified completely and no inheritance rules apply."

oder in der deutschen Übersetzung:

"Tatsächlich werden static Methodenaufrufe zum Kompilierungszeitpunkt aufgelöst. Bei der Nutzung des expliziten Klassennamens ist die Methode bereits gänzlich identifiziert und es kommen keine Vererbungsregeln zur Anwendung."

Der zweite Satz ist vielleicht nicht ganz eindeutig, doch ich entnehme aus beiden Sätzen, dass der Compiler einmalig ermitteln, welche Klasse die auzurufende Methode bereitstellt und dann alle Hinweise auf die Aufruf- bzw. Vererbungskette entfernt.

echo "$verabschiedung $name";