Objekt Referenz überschreiben

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

  • Objekt Referenz überschreiben

    Ich habe ein Problem mit Objekten.
    Schematisch sieht mein code in etwa so aus:

    PHP-Code:
    $layout $this->getLayout();
    echo 
    $layout->name// Standard

    $this->hook->changeLayout($layout)

    echo 
    $layout->name// immer noch Standard anstatt spezial


    class hook {
     public function 
    changeLayout($layout)
     {
        
    $layout = new Layout('spezial');
     }

    nun habe ich das Problem, dass $layout in der Klasse changeLayout nicht überschrieben wird, warum?

  • #2
    PHP: Geltungsbereich von Variablen - Manual
    Wir werden alle sterben

    Kommentar


    • #3
      sorry, ich sehe es nicht

      Kommentar


      • #4
        Hmmm...
        Die Klasse, bzw, später das Hook Objekt, hat eine Methode changeLayout(). In dieser Methode setzt du die lokale Variable $layout. Soweit, alles gut.
        Aber die Variable ist lokal. Also hat sie außerhalb der Methode keine "Präsenz".
        Wie auch?
        Wir werden alle sterben

        Kommentar


        • #5
          Nein, dass sehe ich anders.

          Wenn ich es so mache:

          PHP-Code:
          $layout $this->getLayout(); 
          echo 
          $layout->name// Standard 

          $this->hook->changeLayout($layout

          echo 
          $layout->name// spezial 


          class hook 
           public function 
          changeLayout($layout
           { 
              
          $newlayout = new Layout('spezial')    
              
          $layout->name $newlayout->name
           } 

          dann klappt es wie gewünscht. Aber es ist doch nicht der Sinn der Sache alle Eigenschaften einzeln zu überschreiben.

          $layout ist nur eine Referenz. In der Methode möchte ich das Original (ich glaube Instanz genannt) überschreiben. Wie kann ich die Instanz überschreiben?
          Zuletzt geändert von swsg; 05.09.2013, 06:26.

          Kommentar


          • #6
            Zitat von swsg Beitrag anzeigen
            PHP-Code:
            function changeLayout($layout)  { 
                
            $layout 'some-unimportant-value'

            nun habe ich das Problem, dass $layout in der Klasse changeLayout nicht überschrieben wird, ...
            Das liegt daran, dass in PHP-Funktionen (und damit auch Methoden) Argumente als Kopie und nicht als Referenz übergeben werden. PHP-Objekte (seit Version 5) stellen dabei einen etwas speziellen Fall dar. Sie bestehen aus zwei Teilen: den eigentlichen Objekt-Daten und einem Objekt-Identifier (das ist die Nummer, die dir debug_zval_dump() anzeigt). An eine Funktion wird dabei nicht das Objekt selbst, sondern nur sein Identifier übergeben.

            Soweit so gut. Greifst du jetzt auf die Variable zu, erstellt PHP eine Kopie, mit der die Funktion arbeitet. Wird die Funktion beendet, verschwindet diese Kopie.

            Zitat von swsg Beitrag anzeigen
            Wenn ich es so mache:

            PHP-Code:
            function changeLayout($layout)  { 
                
            $layout->name $something

            dann klappt es wie gewünscht.
            Das Ändern einzelner Properties eines Objektes ändert nicht die Objekt-Variable selbst, deswegen wird in diesem Fall keine Kopie erstellt.

            In der Methode möchte ich das Original ... überschreiben. Wie kann ich [es] überschreiben?
            Indem du eine (PHP-)Referenz benutzt:
            PHP-Code:
            function overwritesInputObject(& $obj) {
                
            $obj = new SomeStupidClassOrSomeStupidOtherThing();

            Ob das sinnvoll ist, sei mal dahingestellt. Ich sehe nicht, wozu man auf diese Art ein Objekt durch ein anderes (oder eine Variable eines anderen Types) ersetzen sollte.
            Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

            Kommentar


            • #7
              Davon ist klar abzuraten. Damit verletzt du das Gesetz der geringsten Verwunderung. PHP-Code sollte kein Überraschungsei für andere Programmierer sein, sondern verständlich und lesbar geschrieben.

              @fireweasel:

              Referenzen in Funktionsparametern sind seit (ich glaub) PHP 5.4 nicht mehr erlaubt. Also so ein Code wäre sowieso nicht besonders zukunftsträchtig.

              Kommentar


              • #8
                Glaube, die Syntaxänderung bezieht sich auf „call-time pass-by-reference“ wie in:

                PHP-Code:
                function f($var)
                {
                    
                // ...
                }

                f(&$foo); 
                - PHP: Passing by Reference - Manual

                Kommentar


                • #9
                  Ah, OK. Da sieht man, wie oft ich das in den letzten Jahren als professioneller Entwickler verwendet hab

                  Kommentar

                  Lädt...
                  X