Autor Zpráva
quatzael
Profil
Lze nějak jednoduše zkopírovat celé pole do jiné proměnné?
Tzn. když chci celou proměnnou $_POST mít například v proměnné $array. Jde to nějak jednoduše?
Joker
Profil
quatzael:
Jde to nějak jednoduše?
Ano, stejně jako u jakékoliv jiné proměnné: Operátorem přiřazení.

$array = $_POST;
quatzael
Profil
Joker:
Aha. Tak to je skvělý. Já jsem myslel, že tam musí být třeba aspoň ty hranatý závorky nebo tak něco.
Díky.
juriad
Profil
quatzael:
Hranaté závorky jsou také operátor; vybere jeden prvek z pole.
janbarasek
Profil
Jenom by mě zajímalo, k čemu to je dobré. Vždyť se na tu hodnotu můžeš kdykoli zeptat pomocí $_POST['...']; a víc neřešit, ta hodnota se zaručeně neztratí a další proměnná je zbytečná komplikace co se přehlednoti týče, navíc je to další místo v paměti.

Načítání do pomocného pole se hodí velice vzácně (snad jenom když je chceš nějak seřadit nebo změnit).
quatzael
Profil
juriad:
Já jsem myslel něco takovýho: $array[]

janbarasek:
Načítání do pomocného pole se hodí velice vzácně (snad jenom když je chceš nějak seřadit nebo změnit).
No něco takovýho, torchu to profiltrovat apod.. Jenom jako duplicitní proměnnou to samozřejmě nepotřebuju.
Fisir
Profil
Reaguji na janbaraska:
je to další místo v paměti
Pokud si to správně pamatuji, tak pokud se obsah původní a nové proměnné nijak nezměnil, ta nová jen odkazuje na tu původní a v paměti tedy téměř žádné místo navíc nezabírá.
Radek9
Profil
Fisir:
ta nová jen odkazuje na tu původní
To by se stalo, pokud bys předal adresu:
$array1 = array(1, 2, 3);
$array2 = &$array1;

$array2[0] = 4;
echo $array1[0]; // vypíše 4

Pokud však použiješ pouhé předání proměnné, pole se zkopíruje. Stejně jako jakákoli jiná primitivní hodnota. Nekopírují se pouze objekty.
Alphard
Profil
Radek9:
Nechce se mi teď moc zabíhat do detailů, ale v principu má [#7] Fisir pravdu. Práce s proměnnými je interně implementována pomocí několika struktur, PHP název proměnné a ostatní data jsou ukládány odděleně. Název proměnné je v tabulce symbolů a odkazuje se na zbytek uložený ve struktuře zval, kde je mj. refcount, tj. počet PHP proměnných, které se na tuto hodnotu odkazují.
Klasické reference na úrovni PHP, o kterých mluvíš, jsou něco jiného, ty jsou implementovány pomocí položky is_ref.

Trochu jsme to zmínili v Základní kurz VI. – Proměnné.
Joker
Profil
janbarasek:
Jenom by mě zajímalo, k čemu to je dobré.
Většinou to není potřeba, ale zrovna kdybych z nějakého důvodu potřeboval nějak manipulovat celým POST polem, asi by bylo lepší si udělat jeho kopii. Samotné $_POST (resp. všechna superglobální pole) bych používal jen pro čtení.

Radek9:
Pokud však použiješ pouhé předání proměnné, pole se zkopíruje. Stejně jako jakákoli jiná primitivní hodnota. Nekopírují se pouze objekty.
Takhle to podle mě není.
PHP používá strategii zvanou copy on write.
Čili přiřazení hodnoty ve skutečnosti nevytvoří kopii té hodnoty v paměti. Ta se vytvoří až ve chvíli, kdy se jedna z těch hodnot změní.

ad Alphard:
Možná by bylo fajn do pokročilejší části přidat nějaký článek ve stylu „Proměnné pro pokročilé“, který by se tím zabýval.
Ale vzhledem k tomu v jakém stavu jsou zatím články je to asi spíš takový plán pro další pětiletku :-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: