Ankündigung

Einklappen
Keine Ankündigung bisher.

call_user_method für Klassen

Einklappen

Neue Werbung 2019

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

  • call_user_method für Klassen

    Hi,
    Gibts ein Funktion mit der ich eine Klasse instanziren kann, wenn ich den Namen erst zur Laufzeit habe?
    Für Funktionen hab ich call_user_method gefunden.
    Ich such sowas like:
    Code:
    $obj = new_was_weiss_ich_denn($className, $params);
    Gruß
    Der Desian
    Wenn dich was ankotzt, machs besser.


  • #2
    PHP-Code:
    <?php
    class Foo
    {
        function 
    bar() { echo 'foobar'; }
    }

    $class 'Foo';
    $f = new $class;
    $f->bar();
    ?>
    Oder über Reflection.

    Kommentar


    • #3
      Och menno..
      Hätte das nicht etwas komplizierter sein können?! *pain*

      Danke!

      Gruß
      Der Desian
      Wenn dich was ankotzt, machs besser.

      Kommentar


      • #4
        Hab aber noch ne Frage:
        Klass hat eine Statische variable 'table'.
        Unschwer zu erraten, dass es wohl die Tabelle ist, in der sich der Datensatz der Instanz befindet.
        Nun die Funktion:
        Code:
        	function getById(&$db, $id, $fields = array('*')) {
        	$class	= __CLASS__;
        	$query	= "SELECT ".implode(', ', $fields)." FROM " .
        		$this->table . 							// hier is das Problem
        		" WHERE id=".$id;
        	return new $class($db->getRow($query));
        }
        ist eine Funktion, die geerbt werden soll, deshalb so kompliziert.

        Frage: Wie kann ich bei dynamischem Klassennamen auf eine Statische Variable der Klasse zugreifen?

        $class::var
        will nicht.
        $this gibt es noch nicht.
        Ich könnte eine leere Instanz erstellen und dann über das Objekt zugreifen aber es muß doch auch anders gehen.
        Ich komm nur grad nicht drauf.

        Gruß
        Der Desian
        Wenn dich was ankotzt, machs besser.

        Kommentar


        • #5
          Nochwas. Grad bemerkt, dass das nicht do will, wie ich mir das vorstelle:
          Code:
          class a {
          	function tuWas() {
          		echo __CLASS__;
          	}
          }
          
          class b extends a {
          }
          
          b::tuWas();
          gibt -> a
          Was muß ich tun, dass -> b ausgegeben wird?

          Gruß
          Der Desian
          Wenn dich was ankotzt, machs besser.

          Kommentar


          • #6
            Du musst tuWas() in der Klasse b() überschreiben und dort __CLASS__ ausgeben lassen.

            Es wird ja überprüft, ob eine Methode namens tuWas() in der Klasse b existiert. Ist das der Fall, so wird diese ausgeführt. Ist das aber nicht der Fall, dann wird geschaut, ob ein extends existiert ... das ist ja hier der Fall. Dann wird in die Klasse a gesprungen und dort wird nach einer Methode tuWas() gesucht .. dann wird der aktuelle Klassenname in deinem Beispiel ausgegeben .. also "a".

            Grüße Ben.
            privater Blog

            Kommentar


            • #7
              Danke, aber in der geerbten Klasse nützt mir die Funktionalität nix.
              Ich brauch sie in der übergeordneten, aber nur über die geerbte Klasse.
              Die Funktion, die ich darüber gepostet hab, verrät wozu ich das haben will.

              Also kleine Bedingung: nur der Inhalt der Funktion tuWas() kann geändert werden.

              Gruß
              Der Desian
              Wenn dich was ankotzt, machs besser.

              Kommentar


              • #8
                Déjà vu.
                Auf das Problem habe ich Dich schon in http://www.phpfriend.de/forum/ftopic50594.html hingewiesen.

                Kommentar


                • #9

                  Ja. Hab den letzten Beitrag nicht mehr mitbekommen -> Urlaub. Sry.
                  Und nu stand ich halt wieder vor dem Problem.

                  Gruß
                  Der Deisan
                  Wenn dich was ankotzt, machs besser.

                  Kommentar

                  Lädt...
                  X