Objekt Referenz überschreiben

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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

    Comment


    • #3
      sorry, ich sehe es nicht

      Comment


      • #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

        Comment


        • #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?
          Last edited by swsg; 05-09-2013, 05:26.

          Comment


          • #6
            Originally posted by swsg View Post
            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.

            Originally posted by swsg View Post
            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!

            Comment


            • #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.

              Comment


              • #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

                Comment


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

                  Comment

                  Working...
                  X