Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Konstruktor und Returnwert

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Konstruktor und Returnwert

    Konstruktoren von Klassen haben keinen Returnwert steht oft geschrieben.
    Stimmt wohl nicht so ganz.

    PHP-Code:
    class foo{
        function 
    __construct(){
            return 
    12345;
        }
    }

    class 
    bar extends foo{
        function 
    __construct(){
            
    $parentReturn parent::__construct();
            
    var_dump($parentReturn);
        }
    }

    $obj = new bar;  //Ausgabe int(12345) 
    Getestet unter:
    PHP V5.3.8 Win
    PHP V5.5.5 Linux

    LG jspit
    PHP-Klassen auf github


  • #2
    Interessant.
    In welcher Echtweltsituation ist so was sinnvoll?
    Standards - Best Practices - AwesomePHP - Guideline für WebApps

    Kommentar


    • #3
      Zitat von jspit
      Konstruktoren von Klassen haben keinen Returnwert steht oft geschrieben.
      Wo steht sowas denn?
      Ein Konstruktor gibt imho immer die Instanz zurück, die Du mit Deinem Versuch zerstört hast.
      Competence-Center -> Enjoy the Informatrix
      PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

      Kommentar


      • #4
        Zitat von Arne Drews Beitrag anzeigen
        Ein Konstruktor gibt imho immer die Instanz zurück, die Du mit Deinem Versuch zerstört hast.
        Ohne Vererbung gibt es ein Objekt (eine Instanz), auch mit return im Konstruktor.

        PHP-Code:
          class foo{

            private 
        $test ="ja";

            function 
        __construct(){
                return 
        12345;
            }
        }

        $obj = new foo;
        var_dump($obj);
        /*
        object(foo)#1 (1) {
          ["test":"foo":private]=>
          string(2) "ja"
        }
        */ 
        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
        PHP.de Wissenssammlung | Kein Support per PN

        Kommentar


        • #5
          Zitat von Arne Drews Beitrag anzeigen
          Wo steht sowas denn?
          Ein Konstruktor gibt imho immer die Instanz zurück, die Du mit Deinem Versuch zerstört hast.
          Ein Konstruktor gibt von natur aus nichts zurück. Bei normalen Bedingungen werden Constructor-Returns verworfen. Mit Constructor-Returns zu arbeiten ist wie allen Kindern im Kindergarten gleichzeitig Beinchen zu stellen und dann Lollies zu verteilen.

          Der Konstruktor initialisiert die Klasse(ninstanz), das war es auch.
          [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

          Kommentar


          • #6
            Zitat von tr0y
            Ein Konstruktor gibt von natur aus nichts zurück.
            Mag ein Verständnisproblem sein, aber:
            PHP-Code:
            // Die Instanz verpufft:
            new MyObject;

            // Die Instanz wird gefangen:
            $oMyObject = new MyObject
            heißt für mich, daß ich eine Instanz ( @hausl: Ein Objekt ist die Instanz einer Klasse! ) zurück geschmissen bekomme.
            Für meine Definition ein Return- oder auch Rückgabewert.
            Was sehe ich daran falsch?


            EDIT: Oh... 6.000
            Competence-Center -> Enjoy the Informatrix
            PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

            Kommentar


            • #7
              Zitat von Arne
              Ein Konstruktor gibt imho immer die Instanz zurück, die Du mit Deinem Versuch zerstört hast.
              Zitat von hausl
              Ohne Vererbung gibt es ein Objekt, auch mit return im Konstruktor.
              Zitat von Arne
              heißt für mich, daß ich eine Instanz ( @hausl: Ein Objekt ist die Instanz einer Klasse! ) zurück geschmissen bekomme.
              Ja, das meinte ich doch, bezogen auf deine *durch-den-Konstruktor-Zerstör* Aussage oben das auch/trotz return im Konstruktor dennoch eine Instanz zurückkommt und nichts zerstört wird (bei dem Beispiel in #4 ohne Vererbung).

              Oh... 6.000
              Gratulation!
              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
              PHP.de Wissenssammlung | Kein Support per PN

              Kommentar


              • #8
                Zitat von Arne Drews Beitrag anzeigen
                Mag ein Verständnisproblem sein, aber:
                PHP-Code:
                // Die Instanz verpufft:
                new MyObject;

                // Die Instanz wird gefangen:
                $oMyObject = new MyObject
                heißt für mich, daß ich eine Instanz ( @hausl: Ein Objekt ist die Instanz einer Klasse! ) zurück geschmissen bekomme.
                Für meine Definition ein Return- oder auch Rückgabewert.
                Was sehe ich daran falsch?


                EDIT: Oh... 6.000
                PHP-Code:
                new Dingens 
                ist instanziierungstechnisch das gleiche wie

                PHP-Code:
                $foo = new Dingens 
                Ablauf beim Instanziieren
                1. Objekt der Klasse erzeugen
                2. __construct() aufrufen, void erwarten

                Bei vererbung muss der parent-Constructor im Constructor aufgerufen werden, da der sonst nicht ausgeführt wird ( daran sieht man auch gut das der Constructor einfach aufgerufen wird und nichts ungewöhnliches passiert ).

                Einer der Findigen source-Gnome hier im Forum kann dir das sicher auch im PHP-Quellcode zeigen.
                [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                Kommentar


                • #9
                  Zitat von tr0y
                  2. __construct() aufrufen, void erwarten
                  Sorry für die blöde Nachfrage aber wo kommt die Instanz her, wenn Du von void sprichst?
                  Competence-Center -> Enjoy the Informatrix
                  PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                  Kommentar


                  • #10
                    Die wird durch das Schlüsselwort new erzeugt.. Was glaubst du wie ist ReflectionClass in der Lage eine Instanz einer Klasse zu erzeugen ohne den Constructor aufzurufen ?
                    [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                    Kommentar


                    • #11
                      Zitat von tr0y
                      Was glaubst du wie ist ReflectionClass in der Lage eine Instanz einer Klasse zu erzeugen ohne den Constructor aufzurufen ?
                      Um ehrlich zu sein ging ich bisher davon aus, daß er dies im Background tut
                      Competence-Center -> Enjoy the Informatrix
                      PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                      Kommentar


                      • #12
                        Zitat von rkr Beitrag anzeigen
                        In welcher Echtweltsituation ist so was sinnvoll?
                        Da wird es nicht so viele Beispiele geben.

                        Mal so angedacht:
                        Wenn abstrakte Klassen eine umfangreiche Initialisierung per Konstruktor mitgeliefert bekommen und diese an einigen Stellen fehlschlägt, ist eine solche Information mitunter auch in der Kindklasse wünschenswert. Da ich kein Freund von try catch bin werfe ich Exceptions nur wenn ein Weiterarbeiten nicht mehr möglich ist.
                        Nun kann ich Informationen über den Erfolg der Initialisierung auch per Klassenvariable übergeben. Diese Information steht dann aber allen abgeleiteten Klassen zur Verfügung, per Returnwert nur in der Ebene darunter.

                        Hab das obige kleine Beispiel auch mal gebracht, da es für mich das Verständnis für die Arbeitsweise eines Konstruktors gestärkt hat. Die rege Beiteiligung hier hat das auch gezeigt.

                        Mein Dank auch an tr0y, der hier alle Unklarheiten aus dem Weg geräumt hat.

                        LG jspit
                        PHP-Klassen auf github

                        Kommentar


                        • #13
                          Ich denke das einzig Besondere am Konstruktor ist, daß dieser, falls vorhanden, automatisch und als erster sofort nach Erzeugen einer neuen Objektinstanz aufgerufen wird.

                          Der Begriff Konstruktor ist vielleicht etwas irreführend, man könnte denken, daß der Konstruktor ein Objekt erstellt, aber in Wirklichkeit ist er nur dazu da um ein neues Objekt zu initialisieren.

                          Ansonsten ist ein Konstruktor/Kontruktormethode eine ganz normale Klassenmethode wie jede andere:

                          PHP-Code:
                          class Test {
                              public function 
                          __construct() {
                                  return 
                          "Konstruktor!";
                              }
                          }

                          $obj = new Test();
                          echo 
                          $obj->__construct(); 
                          vg
                          jack
                          -

                          Kommentar


                          • #14
                            Ich denke das einzig Besondere am Konstruktor ist, daß dieser, falls vorhanden, automatisch und als erster sofort nach Erzeugen einer neuen Objektinstanz aufgerufen wird.

                            Der Begriff Konstruktor ist vielleicht etwas irreführend, man könnte denken, daß der Konstruktor ein Objekt erstellt, aber in Wirklichkeit ist er nur dazu da um ein neues Objekt zu initialisieren.
                            Korrekt.
                            --

                            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                            --

                            Kommentar

                            Lädt...
                            X