Ben: Statische Klassenmethode

Hallo zusammen

Wenn ich den Namen der Klasse in einer Variable habe kann ich sie ja z.B. mit
$myClass=new $className();
instanzieren.

Wenn ich jetzt versuche, eine statische Methode einer Klasse über
$myClass::tu_was();
aufzurufen, dass kommt die Meldung "unexpected T_PAAMAYIM_NEKUDOTAYIM".

Kann mir jemand sagen, ob und wie ich das machen muss damit es funktioniert?

Danke und Gruss
Ben

  1. Hi,

    Wenn ich den Namen der Klasse in einer Variable habe kann ich sie ja z.B. mit
    $myClass=new $className();
    instanzieren.

    Wenn ich jetzt versuche, eine statische Methode einer Klasse über
    $myClass::tu_was();
    aufzurufen, dass kommt die Meldung "unexpected T_PAAMAYIM_NEKUDOTAYIM".

    Kann mir jemand sagen, ob und wie ich das machen muss damit es funktioniert?

    Statische Methoden werden unter Angabe der Klasse aufgerufen, nicht ueber eine Instanz.

    In deinem Beispiel also
    $className::tu_was();

    MfG ChrisB

    1. Hallo ChrisB

      Statische Methoden werden unter Angabe der Klasse aufgerufen, nicht ueber eine Instanz.

      In deinem Beispiel also
      $className::tu_was();

      Ja genau das habe ich ja versucht, ich schrieb ja $myClass:tu_was();. Und in $myClass ist der Klassenname, keine Instanz der Klasse. Aber da kommt eben dann die obengennante Fehlermeldung.

      Hast du das bei dir schonmal zum laugen gebracht?

      Gruss Ben

      1. Hi,

        Statische Methoden werden unter Angabe der Klasse aufgerufen, nicht ueber eine Instanz.

        In deinem Beispiel also
        $className::tu_was();

        Ja genau das habe ich ja versucht, ich schrieb ja $myClass:tu_was();. Und in $myClass ist der Klassenname, keine Instanz der Klasse.

        Du hattest darueber explizit das Beispiel

        $myClass=new $className();

        gebracht - und damit enthaelt $myClass eben nicht den Klassennamen als String, sondern eine Instanz der Klasse.

        Hast du das bei dir schonmal zum laugen gebracht?

        Wenn der Klassenname in einer Variablen stehen soll, scheint's dafuer wohl in PHP-Versionen < 5.3.0 keinen sauberen Weg zu geben - zumindest empfiehlt der dieser Nutzerkommentar auf der Manualseite zu ::, es ueber eval zu machen ...

        MfG ChrisB

        1. Hallo ChrisB

          Du hattest darueber explizit das Beispiel

          $myClass=new $className();
          gebracht - und damit enthaelt $myClass eben nicht den Klassennamen als String, sondern eine Instanz der Klasse.

          Ich hab's auch bemerkt, nachdem ich meinen Beitrag geschrieben habe, dass in meinem Beispiel ein Fehler drin war (zweite Antwort). Tja, einfach unüberlegt abgeschickt...

          Wenn der Klassenname in einer Variablen stehen soll, scheint's dafuer wohl in PHP-Versionen < 5.3.0 keinen sauberen Weg zu geben - zumindest empfiehlt der dieser Nutzerkommentar auf der Manualseite zu ::, es ueber eval zu machen ...

          Danke für den Link. Ist ja sehr unschön, dass mit eval zu machen. Aber wenn es keinen anderen Weg gibt...

          Komisch finde ich es trotzdem, dass es funktioniert, wenn man eine Klasse instanziert (Bsp.: $myClass=new $className();). Da ist ja auch der Klassenname in einer Variablen. Das muss man wahrscheinlich nicht begreifen... :-)

          Gruss Ben

          1. Tach.

            Wenn der Klassenname in einer Variablen stehen soll, scheint's dafuer wohl in PHP-Versionen < 5.3.0 keinen sauberen Weg zu geben - zumindest empfiehlt der dieser Nutzerkommentar auf der Manualseite zu ::, es ueber eval zu machen ...

            Danke für den Link. Ist ja sehr unschön, dass mit eval zu machen. Aber wenn es keinen anderen Weg gibt...

            Doch, den gibt es. Nicht immer sind die Userkommentare auf der Handbuchseite der Weisheit letzter Schluß ...

            --
            Once is a mistake, twice is Jazz.
            1. Hallo Blaubart

              Das funktioniert tatsächlich, danke. Sieht zwar etwas kryptisch aus, aber solange es funktioniert...

              Danke & Gruss
              Ben

    2. Hallo ChrisB

      Jetzt weiss ich was du meintest. In meinem Beispiel war ein Fehler drin. Natürlich habe ich es über $className::tu_was(); probiert und nicht über die vorher erstellte Instanz der Klasse...

      Trotzdem hat es nicht funktioniert.

      Gruss Ben

  2. Tach.

    Kann mir jemand sagen, ob und wie ich das machen muss damit es funktioniert?

    Das hier benutzen: call_user_func(array($className, "doStuff"));

    --
    Once is a mistake, twice is Jazz.