Ankündigung

Einklappen
Keine Ankündigung bisher.

Einfaches "Ist gleich" speichert Referenz statt Wert - Warum?

Einklappen

Neue Werbung 2019

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

  • Einfaches "Ist gleich" speichert Referenz statt Wert - Warum?

    Hi all,

    beim Arbeiten mit XML ist mir folgendes ungewöhnliche Verhalten aufgefallen:

    PHP-Code:
    $xml->Beispiel "Eintrag1";

    $test $xml->Beispiel;

    echo 
    $test
    // Liefert korrekt "Eintrag1"

    $xml->Beispiel "Eintrag2";

    echo 
    $test
    // Liefert jetzt "Eintrag2", es wurde also nicht der Wert in $test gespeichert, sondern eine Referenz auf $xml->Beispiel 
    Warum speichert PHP in diesem Fall nicht den Wert in $test, sondern die Objekt Referenz?

  • #2
    also bei mit kommt 2 mal Eintrag1 raus. Wenn Beispiel eine einfache Membervariable ist.

    Bei dir gibt es wohl __get und __set Funtkionen auf die Beispiel variable und es ist in wirklichkeit ein objekt, dass sollte aber idealerweise in der Doku stehen
    Fatal Error: Windows wird gestartet

    Wie administriert man ein Netzwerk: Beispiel

    Kommentar


    • #3
      Warum speichert PHP in diesem Fall nicht den Wert in $test, sondern die Objekt Referenz?
      weil $test ein SimplXMLElement-Objekt ist.

      Kommentar


      • #4
        Hi,

        danke erst mal für die Antworten. "$xml->Beispiel" ist ein SimplXMLElement-Objekt, das ist richtig. Nur warum wird in solchen Fällen nicht der Wert/Inhalt des Objekts in der Variable $test abgelegt, sondern eine Referenz. Würde er es als Objekt kopieren wäre es zwar weiterhin ein SimplXMLElement-Objekt, aber es würde den Inhalt nicht ändern wenn ich auf das Original Objekt zugreife.

        Normalerweise kenne ich es auch nur so das ich explizit angeben muss wenn ich eine Referenz haben möchte (z.b. bei der Übergabe an Funktionen) die sich "Global" ändern kann und keine Kopie die dann nur noch Lokale gültigkeit hat.

        Ich habe es jetzt so gelöse das ich es als String caste, dann erhalte ich das gewünschte Ergebniss. Mich hat es nur Verwundert da ich es normalerweise so kenne das der Wert zugewiesen wird.

        Kommentar


        • #5
          Normalerweise kenne ich es so das ich explizit angeben muss wenn ich eine Referenz haben möchte
          seit PHP 5 werden Objekte immer als Referenz übergeben.

          Kommentar


          • #6
            D.h. im umkehrschluss, das ich ab PHP 5 explizit sagen muss wenn ich eine Kopie möchte?

            Kommentar


            • #7
              Zitat von MS Master
              Nur warum wird in solchen Fällen nicht der Wert/Inhalt des Objekts in der Variable $test abgelegt, sondern eine Referenz.
              Weil SimpleXML Dinge generell etwas seltsam und unintuitiv tut. Eine Lösung ist es, bei der Zuweisung noch auf String zu casten.

              - http://php.net/manual/en/simplexml.examples-basic.php (Suche nach "(string)")

              Würde er es als Objekt kopieren wäre es zwar weiterhin ein SimplXMLElement-Objekt, aber es würde den Inhalt nicht ändern wenn ich auf das Original Objekt zugreife.
              Was du beschreibst, ist object cloning. Das ist – wie schon angemerkt – seit PHP 5 nicht mehr das Standardverhalten in PHP (und auch nicht in anderen Sprachen wie Java oder C# und dergleichen).

              - http://php.net/manual/en/language.oop5.cloning.php

              Ich habe es jetzt so gelöse das ich es als String caste
              Oh, okay.

              D.h. im umkehrschluss, das ich ab PHP 5 explizit sagen muss wenn ich eine Kopie möchte?
              Ja. Siehe object cloning. Das ist aber selten das, was man will. Wie gesagt: Der springende Punkt bei deiner Frage ist die etwas unintuitive Funktionsweise von SimpleXML.



              Noch kurz zum Referenz-Begriff: In PHP ist es so: Wenn kein &-Operator involviert ist, ist es keine Referenz. Das heißt, dass hier im Thread keine Referenzen vorliegen. Beim Zuweisen von Variablen, die Objekte enthalten, wird ganz normal der Wert der Variablen kopiert. Der Wert sind allerdings nicht die Instanzdaten des Objekts selbst, sondern ein sogenannter object identifier, über den PHP die Daten des Objekts dann letztlich abrufen kann. Diesen object identifier kann man sich als Integer-Index für irgendeine interne Lookup-Tabelle vorstellen.

              Das kann man auch recht einfach demonstrieren:

              PHP-Code:
              $xml->Beispiel "Eintrag1";

              $test $xml->Beispiel;

              $test null;

              echo 
              $xml->Beispiel 
              Hätten wir hier eine Referenz, dann würde die Zuweisung $test = null auch den Wert von $xml->Beispiel ändern.

              In Sprachen wie PHP, Java, C# ist das „Kopieren“/Zuweisen/Übergeben von Variablen – gleichgültig, ob die auf Objekte verweisen – grundsätzlich immer by value. (Wenn kein Operator wie & oder ref im Spiel ist.)

              Kommentar

              Lädt...
              X