adapter: Alternativen zu get_class() und __CLASS__ gesucht

Liebes Forum,

in der folgenden Situation, wo die geerbte Methode einer statischen Klasse statisch aufgerufen wird, wird ein für mich unbefriedigendes Resultat geliefert:

class Klasse {
  function getName() {
    return get_class($this); # [X]
  }
}
class Unterklasse extends Klasse { }
echo Unterklasse::getName();

Ausgegeben wird nämlich "Object", also die Klasse, der $this im obigen Kontext angehört. Da der Aufruf statisch erfolgte, ist das vielleicht sogar okay. Aber:

Würde in Zeile [X]
    return get_class(self);
stehen, wäre die Ausgabe leer.

Würde in Zeile [X]
    return __CLASS__;
stehen, wäre die Ausgabe "Klasse".

Nur wie erreiche ich, dass die Ausgabe "Unterklasse" ist?

Schöne Grüße
adapter

  1. Moin!

    class Klasse {
      function getName() {
        return get_class($this); # [X]
      }
    }
    class Unterklasse extends Klasse { }
    echo Unterklasse::getName();

    Nur wie erreiche ich, dass die Ausgabe "Unterklasse" ist?

    Ohne Beachtung irgendwelcher Nebenbedingungen:

    class Unterklasse extends Klasse {
      function getName() {
        return "Unterklasse";
      }
    }

    Ob jetzt get_class() oder __CLASS__ ein dir genehmes, variableres Ergebnis liefern, müßtest du wohl ausprobieren.

    - Sven Rautenberg

    1. Hallo Sven,

      Ohne Beachtung irgendwelcher Nebenbedingungen:

      class Unterklasse extends Klasse {
        function getName() {
          return "Unterklasse";
        }
      }

      Genau das will ich ja vermeiden, die Methode nochmal definieren zu müssen. Da würde sogar folgendes gehen:

      class Unterklasse extends Klasse {
         function getName() {
           return __CLASS__;
         }
       }

      Dann habe ich aber in jeder Unterklasse sogar exakt denselben Code, was etwas absurd ist. Genau das soll die Vererbung doch vermeiden helfen.

      Ob jetzt get_class() oder __CLASS__ ein dir genehmes, variableres Ergebnis liefern, müßtest du wohl ausprobieren.

      Habe ich ja schon, geht beides nicht. Wäre die Klasse nicht statisch, würde das get_class($this) in der Oberklasse jedoch reichen.

      Mein Anwendungsfall ist etwas komplizierter. Dort führe ich für den Klassennamen jetzt extra eine staische Variable ein. Ist freilich nur eine Frage der Programmierästhetik...

      Werde mich wohl mal auf www.php.net mit der Frage begeben...

      Schöne Grüße
      adapter

      1. Moin!

        Dann habe ich aber in jeder Unterklasse sogar exakt denselben Code, was etwas absurd ist. Genau das soll die Vererbung doch vermeiden helfen.

        Nun ja, vermutlich gibt es deswegen keine Möglichkeit, weil man annimmt, dass das Ergebnis eines statischen Klassenaufrufs "Unterklasse::getName()" logischerweise "Unterklasse" ist - eine Erkenntnis, die man schon beim Programmieren des Aufrufs haben muß, weil man ansonsten die Klasse nicht statisch aufrufen kann.

        Mein Anwendungsfall ist etwas komplizierter. Dort führe ich für den Klassennamen jetzt extra eine staische Variable ein. Ist freilich nur eine Frage der Programmierästhetik...

        Wenn's komplizierter ist, warum vereinfachst du das dann hier?

        - Sven Rautenberg

        1. Hallo Sven,

          Wenn's komplizierter ist, warum vereinfachst du das dann hier?

          Damit das Problem auch deutlich wird. Tatsächlich gebe ich den Klassennamen nicht aus, sondern verwende ihn beim registrieren von Variablen in der Session. Aber das tut nichts zur Sache, also habe ich es weggelassen.

          Schöne Grüße
          adapter

  2. Nur wie erreiche ich, dass die Ausgabe "Unterklasse" ist?

    1. durch intstantiierung, was du aber nicht möchtest.

    2. bei statischem ausführen durch __CLASS__ in der entsprechenden Klasse.

    anders gehts halt net.