Eddie: Problem beim Referenzieren von Objekten

Hallo allerseits,

aus irgendeinem Grund habe ich ein Problem beim Referenzieren eines Objekts. Sieht so aus, als wuerde ich stattdessen eine Kopie erhalten.

Vereinfacht sieht das so aus:

function getMyObject($index)
{
    $myObject = $this->OBJECTS[$index];
    return $myObject;
}

Ändere ich dann eine Eigenschaft auf $myObject, dann wirkt sich das dummerweise nicht auch auf OBJECT[$index] aus.
Was mache ich falsch?

Danke, Eddie

  1. Hallo,
    das scheint wirklich ein Problem zu werden. Ich habe weder was bei Google noch hier im Archiv gefunden, was mir weiterhilft.
    Also, falls Ihr irgendwas darueber wisst, bin ich Euch fuer jeden Hinweis dankbar!

    Hier nochmal ein besseres Beispiel:

    =================
    $OBJECTS[1]->setColor("green");
    $myObject = $OBJECTS[1];
    $myObject->setColor("blue");

    if ($myObject->getColor() == $OBJECTS[1]->getColor() )
    {
        echo "Ausgabe: funzt.";
    }
    else
    {
        echo "Ausgabe: funzt nicht.";
    }

    Ausgabe: funzt nicht.

    Hoffe, das war klarer,
    Eddie

  2. Hoi Eddie

    Dein Problem hat mich gerade interessiert, da ich JAVA gelernt habe und im Moment auch PHP programmiere. Du musst ein bisschen in C denken:

    $useReferences = new UseReferences;
    $myObject = &$useReferences->getMyObject(0);
    echo $myObject."<br />";
    $myObject++;
    $nextObject = $useReferences->getMyObject(0);
    echo $nextObject."<br />";
    $nextObject++;
    $nextObject = $useReferences->getMyObject(0);
    echo $nextObject."<br />";

    class UseReferences
    {
     function getMyObject($index)
     {
         return $this->array[$index];
     }

    var $array = array(1, 2, 3);
    }

    Das gibt dir 1 2 2 aus. Siehst du das & beim ersten Aufruf von useReferences? Das ist der ganze Trick, sonst bekommst du nur Kopien zurück, wie beim 2ten bzw. 3ten Aufruf der Methode.

    Und hier findest du ein paar weiter Infos über das Thema: http://ch.php.net/manual/en/language.references.php

    Hoffe, ich konnte dir helfen und das obige stimmt auch alles ;)

    Gruss
    Simon

    Hallo allerseits,

    aus irgendeinem Grund habe ich ein Problem beim Referenzieren eines Objekts. Sieht so aus, als wuerde ich stattdessen eine Kopie erhalten.

    Vereinfacht sieht das so aus:

    function getMyObject($index)
    {
        $myObject = $this->OBJECTS[$index];
        return $myObject;
    }

    Ändere ich dann eine Eigenschaft auf $myObject, dann wirkt sich das dummerweise nicht auch auf OBJECT[$index] aus.
    Was mache ich falsch?

    Danke, Eddie

    1. Hi Simon,
      Deine Beispiel hat mir jetzt schon eine Menge geholfen. Sitze aber trotzdem immer noch am selben Problem.
      Um bei Deinem Beispiel zu bleiben - das passt naemlich ganz gut - möchte ich auch so eine Funktion (wie hier getMyObject()) haben, die mir aber nichts primitives zurueckliefert (wie hier 1, 2 oder 3), sondern richtige Objekte. Und das geht nicht.

      Nehmen wir mal an, Dein Array wuerde tatsaechlich Objekte enthalten, dann wuerde folgendes (in der Funktion) funktionieren:

      $myObject = &$this->array[$index];

      Ich bekomme tatsaechlich die Referenz auf das Objekt.
      Nur bei der Rueckgabe (return $myObject) verliere ich die Referenz.

      So wie Dein Beispiel gerade dasteht (mit dem EINZIGEN Unterschied, dass es sich um Objekte handelt) geht es bei mir nicht.

      Falls Du noch eine Idee haben solltest, lass es mich wissen!!!

      Am Verzweifeln, Eddie

      1. Salü

        Nehmen wir mal an, Dein Array wuerde tatsaechlich Objekte enthalten, dann wuerde folgendes (in der Funktion) funktionieren:

        $myObject = &$this->array[$index];

        Ich bekomme tatsaechlich die Referenz auf das Objekt.
        Nur bei der Rueckgabe (return $myObject) verliere ich die Referenz.

        Öhm, wenn ich dich richtig verstanden habe: $myObject ist jetzt also eine Referenz auf ein Objekt und jetzt möchtest du diese Referenz gerne zurückgeben. Das sollte so klappen:

        return &$myObject;

        Auch hier wieder ein simples '&', damit keine Kopie von der Referenz (...) entsteht. Geht es so nicht?

        Am Verzweifeln, Eddie

        Nicht verzweifeln ;)