Zadejte hledaný výraz...

Nové pole přepisuje to původní. proc?

sajcah
verified
rating uzivatele
7. 1. 2014 11:09:51
Zdravím,
mám opravdu zajimavý problém, který si nedokážu nějak moc vysvětlit a to se v PHP pohybuji už nějaký čas.
Mám cyklus, kterým si do instance ukládám nějaké hodnoty:
Context::getContext()->user_settings = (object)array(
'value' => $res->value,
'type' => $res->type,
'name' => $res->name
);
V dalším scriptu si hodnoty přeberu a uložím do nového pole:
$settings = $this->context->user_settings;
Náledně v novém poli provedu unset na value:
unset($settings->value);
a stane se to že me zmizi value ze $settings, ale zároveň i z originálního pole $this->context->user_settings !!
Může mě někdo tohle chování vysvětlit ?
Děkuji moc :)
7. 1. 2014 11:09:51
https://webtrh.cz/diskuse/nove-pole-prepisuje-to-puvodni-proc#reply982819
ViPErCZ
verified
rating uzivatele
(21 hodnocení)
7. 1. 2014 11:12:41
Nevrací toto $this->context->user_settings; náhodou referenci na to pole???
Jak vracíte proměnnou user_settings z instance objektu context???
7. 1. 2014 11:12:41
https://webtrh.cz/diskuse/nove-pole-prepisuje-to-puvodni-proc#reply982818
sajcah
verified
rating uzivatele
7. 1. 2014 11:12:42
Nn, žádný pointer se nikde nepoužívá a ve třídě Context je jen public $user_settings; Do kterého se to cyklem dynamicky na sype.
7. 1. 2014 11:12:42
https://webtrh.cz/diskuse/nove-pole-prepisuje-to-puvodni-proc#reply982817
To, čemu říkáte "pole" je ve skutečnosti objekt. Sám ho tak castujete v prvním příkladu.
Objekty se vždy předávají referencí.
PHP: Objects and references - Manual
http://www.php.net/manual/en/language.oop5.references.php
Tudíž při přepsaní objektu přepisujete objekt dostupný v jiné části jako
7. 1. 2014 11:39:42
https://webtrh.cz/diskuse/nove-pole-prepisuje-to-puvodni-proc#reply982816
Aleš Trunda
verified
rating uzivatele
(16 hodnocení)
7. 1. 2014 11:42:46
Dobrý den,
kdo v php dělá samozřejmě ví, že v php5 se objekty předávají jako reference - tady neděláte s polem, z toho jenom získáte hodnoty k vytvoření objektu, nadále již pracujete s tímto objektem a předáváte jej jako referenci. Čili pokud chcete aby se vytvořily dva objekty, které budou stejné, ale na různých adresách (změna v jednom se neprojeví ve druhém), tak musíte použít něco takového $objectB = clone $objectA;
7. 1. 2014 11:42:46
https://webtrh.cz/diskuse/nove-pole-prepisuje-to-puvodni-proc#reply982815
sajcah
verified
rating uzivatele
7. 1. 2014 12:35:35
Díky za informace :)
7. 1. 2014 12:35:35
https://webtrh.cz/diskuse/nove-pole-prepisuje-to-puvodni-proc#reply982814
Pro odpověď se přihlašte.
Přihlásit