Klassennamen einer Child-Klasse abfragen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Klassennamen einer Child-Klasse abfragen

    Hallo,

    gibt es eigentlich eine Möglichkeit mit einer statischen Methode in der Parent-Klasse den Klassennamen der Child-Klasse zu ermitteln?

    Also z.B.:


    PHP-Code:
    class {
        public static function 
    getClassName() {
            echo 
    __CLASS__;
        }
    }

    class 
    extends {
        
    }

    A::getClassName()
    B::getClassName(); 
    A - Ausgabe: A
    B - Ausgabe: A (hier bräuchte ich B)

    Vielen Dank im Voraus
    jack

  • #2
    static dient nicht nur zur Definietion von statischen Methoden:
    PHP-Code:
    class 
        public static function 
    getClassName() { 
            echo static; 
        } 


    class 
    extends {} 
    self und __CLASS__ werden zur Kompilierzeit definiert, sind also immer der Name der Klasse, in denen sie definiert werden. static hingegen wird zur Laufzeit definiert.

    Kommentar


    • #3
      danke erstmal für die schnelle Antwort.

      Leider erhalte ich bei deinem Code die folgende Fehlermeldung:

      " Parse error: syntax error, unexpected ';', expecting T_PAAMAYIM_NEKUDOTAYIM "

      gruß
      jack

      Kommentar


      • #4
        Hm, ich dachte, static sei eine Konstante, wie self und __CLASS__. Ist leider nicht so, wie ich durch das Manual erfahren habe.
        Du kannst mit static also nur Methoden und Eigenschaften aufrufen.

        Dieser Code sollte aber funktionieren:

        PHP-Code:
        class 
            public static function 
        getClassName() { 
                echo static::
        getName();
            }

            public static function 
        getName() {
                return 
        __CLASS__;
            }
        }

        class 
        extends {}

        B::getClassName() 

        Kommentar


        • #5
          Hallo,

          get_class($this) sollte das sein, was du suchst.

          Gruß,

          Amica
          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
          Super, danke!
          [/COLOR]

          Kommentar


          • #6
            sorry, aber dein Code liefert ebenfalls die Parent-Klasse "A" zurück.

            B::getClassName(); // Ausgabe: "A"

            Du hast die Abfrage einfach in eine zusätzliche Methode verlagert, ansonsten hat sich ja nichts geändert?!

            gruss
            jack

            Kommentar


            • #7
              @Amica

              Nein, get_class($this) kann leider nicht funktionieren. Es ist eine statische Methode, deshalb ist $this nicht vorhanden/definiert.

              gruß
              jack

              Kommentar


              • #8
                Okay, stimmt. Wenn die Klasse aber prinzipiell instanziierbar ist, kannst du get_class trotzdem nutzen:
                PHP-Code:
                get_class(new static()); 
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  Zitat von jack88 Beitrag anzeigen
                  sorry, aber dein Code liefert ebenfalls die Parent-Klasse "A" zurück.

                  B::getClassName(); // Ausgabe: "A"
                  Stimmt, B::getClassName() muss definiert sein, nicht A::getClassName(). So steht es jedenfalls im Tutorial, ausprobiert habe ich das jetzt nicht, weil ich gerade keinen Interpreter zur Hand habe.

                  Kommentar


                  • #10
                    1. Wozu braucht man den Parent Class Name?
                    2. geht das nicht mit get_called_class() und Reflection?
                    Wir werden alle sterben

                    Kommentar


                    • #11
                      @Amica
                      hej, so einen Konstrukt "new static()" sehe ich ehrlich gesagt zum ersten Mal, verstehe es auch nicht ganz, aber.... es funktioniert :-) Ist schon ziemlich tricky. Suboptimal finde ich allerdings, daß man jedes Mal quasi eine Instanz zum wegwerfen erzeugen muss nur um den Klassennamen herauszubekommen.

                      @combie
                      get_called_class() - DAS IST ES!
                      Wozu braucht man den Parent Class Name?
                      Nicht den Parent - sondern den Child, also den Namen der abgeleiteten Klasse.
                      Ich benötige den Namen als Parameter um Models und DataMapper dynamisch zu erstellen. Dabei brauch ich den Namen der jeweiligen Modelklasse und nicht den der generischen Parentklasse. Wenn ich mit dem "Kram" hoffentlich irgendwann fertig bin, werde ich es mal hier komplett posten.

                      Gruß und nochmals super vielen Dank für die gigaschnelle Hilfe!
                      jack

                      Kommentar


                      • #12
                        Elternklassen sollten nichts über ihre Kinder wissen(müssen).
                        Ein Design Fehler?
                        Deswegen vermute ich, dass du es mit den static Methoden übertreibst.
                        Wir werden alle sterben

                        Kommentar


                        • #13
                          Ein Design Fehler?
                          Vielleicht, will ich gar nicht ausschließen. Wie gesagt, zurzeit bin ich noch am basteln ;-)
                          Bis jetzt habe ich allerdings nur eine statische Methode und das nur, weil ich den Konstruktor umgehen muss um das erzeugte Objekt direkt einem übergeordneten "Manager-Objekt" zu übergeben. Mal schauen was dabei herauskommt ;-)
                          Zuletzt geändert von jack88; 04.07.2012, 22:49.

                          Kommentar

                          Lädt...
                          X