[ Ilija Studen @ 21.04.2004. 09:10 ] @
Kada funkcija vraca objekat sta dobijam? Referencu?

Ako ne kako da kazem f-ji da vrati bas referencu?
[ -zombie- @ 21.04.2004. 11:40 ] @
u php5 se svi objekti prenose baš kao reference (slično kao u javi). svaka takva funkcija u stvari vraća referencu.

implicitno kopiranje objekta se nikada ne dešava. ako pak nasuprot želiš da iskopiraš objekat (i dobiješ drugu zasebnu instancu sa istim svojstvima i osobinama), moraš explicitno da pozoveš __clone() metod (opet slično javi ;).
[ Gojko Vujovic @ 21.04.2004. 17:45 ] @
Je l podržava serijalizaciju i kako se tada ponaša? Na primer na mreži objekata (jedni sadrže reference ka drugima i tako celo stablo).
[ -zombie- @ 22.04.2004. 04:13 ] @
// prvo da se ispravim/dopunim. izgleda da je od bete4 za kloniranje ubačena nova ključna reč: $newObj = clone $oldObj;

naravno da podržava serializaciju, i naravno da podržava reference u serializovanoj mreži objekata.

u prvim alfama petice je valjda bilo problema sa ciklusima (rekurzivnim referenciranjem), sada i to radi..

našao sam samo jedan problem sa referenciranjem na početni serijalizovani objekat (u beti3, nisam još stigao da se igram za RC).

naime, kada imamo rekurziju posle već prvog nivoa, npr $x->a = $x; to radi kako se i očekuje. ali kada imamo recimo ovakav kod:

Code:

    class Alpha {
        var $a;
    }

    class Beta {
        var $b;
    }

    $x = new Alpha();
    $x->a = new Beta();
    $x->a->b = $x;
    $y = unserialize(serialize($x));
    var_dump($x, $y);


za sve koji razumeju problematiku, rezultat nije baš očekivan:

Code:

object(alpha)#1 (1) {
  ["a"]=>
  object(beta)#2 (1) {
    ["b"]=>
    object(alpha)#1 (1) {
      ["a"]=>
      object(beta)#2 (1) {
        ["b"]=>
        *RECURSION*
      }
    }
  }
}
object(alpha)#3 (1) {
  ["a"]=>
  &object(beta)#4 (1) {
    ["b"]=>
    object(alpha)#5 (1) {
      ["a"]=>
      &object(beta)#4 (1) {
        ["b"]=>
        object(alpha)#5 (1) {
          ["a"]=>
          *RECURSION*
        }
      }
    }
  }
}


po referencama objekata (ID brojevi posle imena klasa, npr #3), vidi se da $y->a->b nije (rekurzivna) referenca na $y, već je $y->a->b->a referenca na $y->a..