frankx: class konstruktor parameter extends

HalloZsammen,

mit

class Test
{
 function Test($parameter)
  {
    $this->var1=$parameter;
  }
}

und
$neu = new Test('irgendwas');
setze ich ja
$neu->var1 auf den wert 'irgendwas';

wenn ich

class ExtendTest extends Test machen möchte, und jetzt einen 2. Paramater übergeben möchte, so dass dann bei

$neuExtended = new ExtendTest ('irgendwas1', 'irgendwas2') zwei Paramter übergeben werden können, wie mach ich das? Die Beispiele die ich fand, zeigten das immer nur ohne Parameterübergabe beim Konstruktor.

Dank Frankx

  1. Hallo!

    wenn ich

    class ExtendTest extends Test machen möchte, und jetzt einen 2. Paramater übergeben möchte, so dass dann bei

    $neuExtended = new ExtendTest ('irgendwas1', 'irgendwas2') zwei Paramter übergeben werden können, wie mach ich das? Die Beispiele die ich fand, zeigten das immer nur ohne Parameterübergabe beim Konstruktor.

    Ich weiß nicht, ob ich deine Frage richtig verstanden habe. Aber warum machst du nicht einfach in der Klasse ExtendTest einen Konstruktor mit 2 Parametern?

    class ExtendTest extends Test {
       public function __construct($para1, $para2){
        ......
      }
    }

    mfg
      frafu

    1. Hallo frafu!

      dank für die antwort. na, ich dachte, vom extenden habe ich, dass ich die klasse nicht nochmal komplett neu definieren müsste. es sind ja nicht nur zwei parameter, sonder vielleicht bei der ersten klasse 8 und bei der zweiten eben die 8 und nochmal 8 neue. und die variablenzuweisung der ersten acht würde ich mir dann durch das extenden sparen wollen...; oder ist das falsch gedacht?

      gruß, frankx

      1. Hallo!»» Hallo frafu!

        dank für die antwort. na, ich dachte, vom extenden habe ich, dass ich die klasse nicht nochmal komplett neu definieren müsste. es sind ja nicht nur zwei parameter, sonder vielleicht bei der ersten klasse 8 und bei der zweiten eben die 8 und nochmal 8 neue. und die variablenzuweisung der ersten acht würde ich mir dann durch das extenden sparen wollen...; oder ist das falsch gedacht?

        gruß, frankx

        Aso! Definieren must du den neuen Konstruktor trotzdem, aber die Zuweisungen die die Basisklasse schon erledigt, kannst du dem parent Konstruktor überlassen.

        Beispiel:

        class A{
          protected $a;
          public function __construc($a_in){
              $this->a=$a_in;
          }
        }

        class B{
          protected $b;
          public function __construc($a_in,b_in){
              parent::__construct($a_in); // hier wird der Konstruktor von A aufgerufen
              $this->b=$b_in;
          }
        }

        mfg
          frafu

        1. Hallo

          dank für die antwort. na, ich dachte, vom extenden habe ich, dass ich die klasse nicht nochmal komplett neu definieren müsste. es sind ja nicht nur zwei parameter, sonder vielleicht bei der ersten klasse 8 und bei der zweiten eben die 8 und nochmal 8 neue. und die variablenzuweisung der ersten acht würde ich mir dann durch das extenden sparen wollen...; oder ist das falsch gedacht?

          Nicht denken, sondern nachlesen ;-) Dazu ist das PHP-Handbuch da. Die englische Version ist übrigens besser und daher im Zweifelsfall vorzuziehen. Was steht in der Signatur einer Forumsteilnehmerin (ich find' sie gerade nicht) so treffend: Zwei Stunden Trial and Error ersparen einem 10 Minuten Nachschlagen im Handbuch.

          Aso! Definieren must du den neuen Konstruktor trotzdem, aber die Zuweisungen die die Basisklasse schon erledigt, kannst du dem parent Konstruktor überlassen.

          was nur in PHP5 geht, siehe PHP-Handbuch, Objekte und Klassen (PHP5), auch wenn es in PHP4 (und PHP3) prinzipiell ähnlich geht. Den Aufruf des Konstruktors der Basisklasse muss der Programmierer schon selbst vornehmen, siehe PHP-Handbuch, Klassen und Objekte (PHP4), der Kasten mit Überschrift "Achtung".

          Freundliche Grüße

          Vinzenz

          1. Hallo!

            was nur in PHP5 geht, siehe PHP-Handbuch, Objekte und Klassen (PHP5), auch wenn es in PHP4 (und PHP3) prinzipiell ähnlich geht. Den Aufruf des Konstruktors der Basisklasse muss der Programmierer schon selbst vornehmen, siehe PHP-Handbuch, Klassen und Objekte (PHP4), der Kasten mit Überschrift "Achtung".

            Da ich nur noch mit php5 programmiere, hab ich gar nicht daran gedacht, dass das ja mit der noch am weitesten verbreiteten 4er nicht geht.

            mfg
              frafu

            1. Hallo!

              Da ich nur noch mit php5 programmiere, hab ich gar nicht daran gedacht, dass das ja mit der noch am weitesten verbreiteten 4er nicht geht.

              Der Code des Ausgangspostings lässt vermuten, dass hier mit hoher Wahrscheinlichkeit PHP4 vorliegt: ein Konstruktor ist eine Funktion, die den gleichen Namen trägt wie die Klasse, die typische PHP4-Konstruktion.

              Freundliche Grüße

              Vinzenz

              1. Hallo!

                Der Code des Ausgangspostings lässt vermuten, dass hier mit hoher Wahrscheinlichkeit PHP4 vorliegt: ein Konstruktor ist eine Funktion, die den gleichen Namen trägt wie die Klasse, die typische PHP4-Konstruktion.

                Diese Notation funktioniert aber in php5 auch noch. Warum wurde das eigentlich geändert? Mir gefällt der Konstruktor der mit dem Klassennamen aufgerufen wird einfach besser.
                Wahrscheinlich bin ichs einfach von Java so gewohnt ....

                mfg
                  frafu

                1. echo $begrüßung;

                  [...] ein Konstruktor ist eine Funktion, die den gleichen Namen trägt wie die Klasse, die typische PHP4-Konstruktion.

                  Diese Notation funktioniert aber in php5 auch noch. Warum wurde das eigentlich geändert?

                  Das wurde geändert, damit man beim Konstruktoraufruf nicht immer den Namen der Elternklasse wissen muss, bzw. die Konstruktor-Aufrufe anpassen muss, wenn sich an der Klassen-Hierarchie etwas ändert. Siehe: Changes in PHP 5/Zend Engine II - Unified Constructors

                  echo "$verabschiedung $name";