Klonování Nette/Utils/ArrayHash
- Bajaja
- Člen | 22
Ahoj,
zjistil jsem, ze mi v aplikaci dela bordel ArrayHash ktery ziskavam v success metode formulare. Hned na zacatku si ho naklonuju pro pozdejsi podminecne odeslani hodnot emailem.
<?php
$emailValues = clone $values;
?>
Dale zpracovavam data ve kterych je mimo jine vnorene dalsi ArrayHash s nazvem people. Ty si prochazim, ukladam do DB a doplnuji nejake dalsi informace.
<?php
foreach ($values->people as $person) {
$person->event = $event;
$person->company = $company;
}
?>
Poznamka: $event
a $company
jsou Doctrijni
entity.
No a co se nestane po odeslani emailu s puvodnim ArrayHash
$emailvalues
? Spadne mi to na var_export does not handle
circular references.
Zkousel jsem si tedy upravovat data $values
a zjistil, ze ty se
opravdu naklonovali a jakakoli uprava nema vliv na klon, ale pokud prochazim
vnorene ArrayHash (people)
a upravuju data tam, tak je upravuju
i v klonu.
Tohle mi pripada jako bug. Nebo se mylim?
- Bajaja
- Člen | 22
Prave to je ten problem. PHPko nevytvori uplnou kopii. Pouze prvni uroven. To podle mne neni spravne.
Neni potreba predavat data jinam, jen je soupnu do process servicy a ta mi je
doplni o vytvorene entity, ktere se mi zase pozdeji hodej jinde. Je to pouze
prepravka, coz $values
jsou.
Klonuju ho prave proto, ze si sobe posilam objednavku na email ve stylu
<?php
{php var_export($values)}
?>
Jenze ty entity maji reference ve smycce a ani je v emailu nepotrebuji. Takze si vsechna data naklonuju jeste pred dalsi praci s nimi…
- Pechy.cz
- Bronze Partner | 21
Správné chování ArrayHash to je, protože se tak chová clone v PHP normálně. A je blbost, aby se to tady chovalo jinak.
Jak je popsáno na stackoverflow tak řešením je např. DeepCopy