Daniel: Polymorphie in PHP

ALoha Leute,

also mal ne Frage. Ich habe einen Konstruktor und jetzt möchte ich den Konstruktor einmal mit und einmal ohne Übergabeparameter. Wie geht das?

Naja ich weiß wie es nicht geht (hmm warum nicht? so sollte es eigentlich gehen):

class test {
  var $id;
  var $text;

functions test (){
    $this->id = 2;
    $this->text = "bla";
  }

functions test ($idpara, $textpara){
    $this->id = $idpara;
    $this->text = $textpara;
  }

function getID (){
    return this->id;
  }
}

$objekt1 = new test();
$objekt2 = new test(12, "blabla");
echo $objekt1->getID();
echo $objekt2->getID();

Naja und das gibt nen Fehler. Weiß jemand etwas dazu?

Bis dann

Daniel

  1. Hallo Daniel,

    also mal ne Frage. Ich habe einen Konstruktor und jetzt möchte ich den Konstruktor einmal mit und einmal ohne Übergabeparameter. Wie geht das?

    Ein Link in die de.comp.lang.php FAQ

    10.6. Was sind polymorphe Funktionen? Kann ich sie simulieren?
    http://www.dclp-faq.de/q/q-klassen-polymorphie.html

    Gruß
      Christian

    1. Hi Christian,

      na das ist ja schon ne Antwort. Leider zwar keine Zufriedenstellende, da es leider keine Polymorphie gibt, aber ok

      Danke für deine Antwort

      Daniel

      1. na das ist ja schon ne Antwort. Leider zwar keine Zufriedenstellende, da es leider keine Polymorphie gibt, aber ok

        Wir warten auf PHP5 ;-)

        Gruß
          Christian

        1. Hi!

          Wir warten auf PHP5 ;-)

          Ist das schon in Entwicklung?

          Gruß
            Daniel

          1. Wir warten auf PHP5 ;-)
            Ist das schon in Entwicklung?

            Ja  http://snaps.php.net/

  2. Hi,

    du könntest dem Konstruktor evtl Defaultwerte verpassen:

    class test {
      var $id;
      var $text;

    functions test ($idpara = 2, $textpara = "bla"){
        $this->id = $idpara;
        $this->text = $textpara;
      }

    function getID (){
        return this->id;
      }
    }

    $objekt1 = new test();
    $objekt2 = new test(12, "blabla");
    echo $objekt1->getID();
    echo $objekt2->getID();

    Defaultwerte müssen, aber immer am Ende der Parameterliste stehen!

    Gruß
    Christian

    1. Hi Christian (ist heute Christian helfen anderen Tag;)),

      also das ist natürlich auch ne gute Möglichkeit... Danke

      Bis dann

      Daniel

  3. Hallo Daniel,

    Und hier die komplett generische Lösung:

    ---- Pseudocode:

    function mache (array $a) {
     ...
    }

    function mache (int $a, bool $b) {
     ...
    }

    function mache (string $a, string $b) {
     ...
    }

    ---------

    wird zu:

    ------ PHP-Code
    function mache_array ($a) {
     ...
    }

    function mache_intbool ($a, $b) {
     ...
    }

    function mache_2string ($a, $b) {
     ...
    }

    function mache () {
      $arg_list = func_get_args ();
      if (count ($arg_list) == 1) {
        if (is_array ($arg_list[0])) {
          return mache_array ($arg_list[0]);
        } else {
          return;
        }
      } else if (count ($arg_list) == 2) {
        if (is_int ($arg_list[0]) && is_bool ($arg_list[1])) {
          return mache_intbool ($arg_list[0], $arg_list[1]);
        } else if (is_string ($arg_list[0]) && is_string ($arg_list[1])) {
          return mache_2string ($arg_list[0], $arg_list[1]);
        } else {
          return;
        }
      } else {
        return;
      }
    }

    -------

    Diese Lösung ist zwar recht kompliziert, aber damit kann man *jede* Art von Polymorphie in PHP simulieren.

    Viele Grüße,
    Christian

    1. Hi Christian,

      na klar.. das geht natürlich auch... naja aber ich habs jetzt so gemacht, dass ich einfach optionale Parameter mache, weil ich das ganze auch im Konstruktor brauch und der ggf. nicht mit Parameter übergeben wird.

      1. Hallo Daniel,

        aja aber ich habs jetzt so gemacht, dass ich einfach optionale Parameter mache, weil ich das ganze auch im Konstruktor brauch und der ggf. nicht mit Parameter übergeben wird.

        Schon klar, dass Du eine bessere Lösung hast. Ich wollte Dir nur eine andere Lösung vorstellen, die funktioniert, wenn Du mal komplexere Dinge brauchst als optionale Parameter. (außerdem schreibe ich einige Antworten auch für das Archiv :-))

        Viele Grüße,
        Christian

        1. Hi Christian,

          sollte jetzt nichts negatives gegen dich sein, hoffentlich kam das jetzt nicht so rüber...

          Naja bis dann mal

          Daniel

          1. Hallo Daniel,

            sollte jetzt nichts negatives gegen dich sein, hoffentlich kam das jetzt nicht so rüber...

            Nein, ich wollte nur eine Sache klarstellen, die ich im ersten Posting nicht so ganz deutlich rübergebracht habe. :-)

            Viele Grüße,
            Christian