Autor | Zpráva | ||
---|---|---|---|
capricorn Profil |
#1 · Zasláno: 16. 10. 2008, 15:55:01 · Upravil/a: capricorn
Zdravim, zajimalo by mne, jaka z nize uvedenych testu je spravna moznost. Jinak vicerozmerne pole vytvarim pomoci vypisu z db a na objemu se urcite bude zvetsovat, protoze tu funkci budu pouzivat pouze k tvorbe selectu. Ten cyklus slouzi jen k testovani.
$array = array('limit' => array(1 => 1, 20 => 20, 30 => 30, 40 => 40, 50 => 50), 'order' => array('asc' => 'Vzestupně', 'desc' => 'Sestupně')); function test1(&$array){ // tady se sestavi select } function test2($array, $nazev){ // tady se sestavi select } // test1 $time = microtime(true); for($i=0;$i<100000;$i++) { $test1 = test1($array['limit']); } echo(microtime(true) - $time) .'<br>'; //test2 $time = microtime(true); for($i=0;$i<100000;$i++) { $test2 = test2($array, 'limit'); } echo(microtime(true) - $time).'<br>'; |
||
ninja Profil |
#2 · Zasláno: 16. 10. 2008, 16:23:58
Vicerozmerne pole se predava uplne stejne jako kazda jina promena. Znak "&" znaci, aby se nevtvarela nova kopie promene, ale pouzila puvodni referenci. To se hodi v pripade, ze chcete s danou promenou manipulovat (zejmena jedna li se o objekt).
|
||
capricorn Profil |
#3 · Zasláno: 16. 10. 2008, 18:03:48
ninja
Znak "&" znaci, aby se nevtvarela nova kopie promene, ale pouzila puvodni referenci. Chapu to dobre, ze napr. pri 10-ti volani funkce se pouzije puvodni reference? |
||
BetaCam Profil |
#4 · Zasláno: 16. 10. 2008, 20:00:10
capricorn
„Chapu to dobre, ze napr. pri 10-ti volani funkce se pouzije puvodni reference?“ Ne použije se vždy reference na to co se pošle jako argument funkce. ninja „Znak "&" znaci, aby se nevtvarela nova kopie promene, ale pouzila puvodni referenci.“ Jen bych doplnil, že PHP se používá lazy copy pokud se tedy proměnná nemodifikuje nevytváří se její kopie. |
||
capricorn Profil |
#5 · Zasláno: 16. 10. 2008, 20:50:16
BetaCam
Ne použije se vždy reference na to co se pošle jako argument funkce. Asi jsem unaveny, ale ja to proste nemuzu dostat do hlavy. Neslo by to prosim vysvetlit na nejakem prikladu? |
||
BetaCam Profil |
#6 · Zasláno: 16. 10. 2008, 22:52:23
capricorn
„Asi jsem unaveny, ale ja to proste nemuzu dostat do hlavy. Neslo by to prosim vysvetlit na nejakem prikladu?“ To by se jistě dalo otázka je co přesně chceš vysvětlit. Pokud ti jde o rozdíl použití reference oproti klasickému předání tak to ukazuje následující příklad : <?php error_reporting(E_ALL); function reference(&$arg){ $arg[1] = 'modified'; } function noreference($arg){ $arg[1] = 'modified'; } $array = array('jedna', 'dva', 'tri'); $array2 = array(1,2,3); noreference($array); var_dump($array); reference($array); var_dump($array); reference($array2); var_dump($array2); ?> |
||
imploder Profil |
#7 · Zasláno: 16. 10. 2008, 23:09:18 · Upravil/a: imploder
&$prom je ukazatel na proměnnou $prom. Je to stejné jako & v C, jen v PHP není *, hodnota na té adrese pak vystupuje ve funkci pod názvem $prom (bez hvězdičky). Je to jenom na předávání parametrů odkazem místo hodnotou, & se dává jenom do definice funkce, ne do volání. BetaCamův příklad to názorně ukazuje.
|
||
capricorn Profil |
#8 · Zasláno: 17. 10. 2008, 14:15:55
BetaCam, imploder
Cetl jsem si to asi hodinu dokolecka dival se na vypis, ale presto me to neni zcela jasne. Jasne me je jen to, co dela prvni volani noreference($array) a druhe volani funkce reference($array), ale to treti volani funkce reference($array2), tomu porad nerozumim. Proc u toho tretiho volani ma hodnotu jen klic 1 a klice 0 a 3 jsou bez hodnot? |
||
Paja Profil |
#9 · Zasláno: 17. 10. 2008, 14:19:34 · Upravil/a: Paja
Pokud použiješ
&$proměnná $proměnná |
||
capricorn Profil |
#10 · Zasláno: 17. 10. 2008, 15:31:52
Paja
Porad to nechapu. :-( Tak co bude obsahovat promenna &$arg pred volanim reference($array2); ? |
||
DoubleThink Profil * |
#11 · Zasláno: 17. 10. 2008, 16:09:18
& je operátor reference. Pokud jej dáš před název proměnné, neodešle se do funkce hodnota proměnné, ale její adresa v paměti. Uvnitř funkce se tedy nevytvoří kopie proměnné, ale pracuje se s tou původní.
|
||
BetaCam Profil |
#12 · Zasláno: 17. 10. 2008, 16:45:42
capricorn
Tady máš ještě dvě alternativy toho jak "obejít reference". Sice to ne ní zrovna ideální a není to uplně to samé co dělá reference, ale třeba ti to pomůže lépe pochopit problematiku. <?php error_reporting(E_ALL); function reference(&$arg){$arg[1] = 'modified';} function noreference($arg){$arg[1] = 'modified';} function useGlobal(){global $globarray; $globarray[1] = 'modified';} function useReturn($arg){$arg[1] = 'modified'; return $arg;} $array = array('jedna', 'dva', 'tri'); $array2 = array(1,2,3); noreference($array); var_dump($array); reference($array); var_dump($array); reference($array2); var_dump($array2); $array = array('jedna', 'dva', 'tri'); $globarray = array('jedna', 'dva', 'tri'); useGlobal(); var_dump($globarray); $array = useReturn($array); var_dump($array); ?> „ ale to treti volani funkce reference($array2), tomu porad nerozumim. Proc u toho tretiho volani ma hodnotu jen klic 1 a klice 0 a 3 jsou bez hodnot?“ Tak teď ti nerozumím. 1) klíč 3 v poli $array2 vůbec není a to ani před voláním funkce reference() ani po ní. 2) klíč 1 je v poli modifikován na hodnotu "modified" ostatním klíčům zůstávají hodnoty stejné. |
||
capricorn Profil |
#13 · Zasláno: 17. 10. 2008, 19:29:51 · Upravil/a: capricorn
DoubleThink
& je operátor reference. Pokud jej dáš před název proměnné, neodešle se do funkce hodnota proměnné, ale její adresa v paměti. Uvnitř funkce se tedy nevytvoří kopie proměnné, ale pracuje se s tou původní. Tohle mne je uz jasne, ale asi si sedim na vedeni, ale nemuzu porad pochopit, proc druhe volani reference($array2); var_dump($array2); vypise array(3) { [0]=> int(1) [1]=> string(8) "modified" [2]=> int(3) } BetaCam 1) klíč 3 v poli $array2 vůbec není a to ani před voláním funkce reference() ani po ní. Chybicka se vloudila. 2) klíč 1 je v poli modifikován na hodnotu "modified" ostatním klíčům zůstávají hodnoty stejné. No jo, ale kdyz zustavaji stejne, tak proc maji prazdne hodnoty, viz horni vypis? Jinak se na mne nezlobte, ze to porad zcela nechapu, ale ja to urcite pochopim, chce to jen cas, protoze dychtim to pochopit. |
||
BetaCam Profil |
#14 · Zasláno: 17. 10. 2008, 20:05:16 · Upravil/a: BetaCam
capricorn
„No jo, ale kdyz zustavaji stejne, tak proc maji prazdne hodnoty, viz horni vypis? “ Nemají prázdné hodnoty. Mají hodnoty 1 a 3. Tady nejde o to, že nechápeš druhé volání, ale o to že nechápeš výpis funkce var_dump(). Výpis var_dumpu může být různorodý, ale vždy říká to samé. Klasický výstup var_dumpu : array(3){ [0]=> int(1) [1]=> string(8) "modified" [2]=> int(3) } Upravený výstup var_dumpu : array 0 => int 1 1 => string 'modified' (length=8) 2 => int 3 Jak vidíš výstup je jiný, ale obojí říká to samé. když to vemu popořade : array(3){ // var_dumpu bylo předáno pole o třech prvcích [0]=> int(1) // klíč 0 obsahuje hodnotu 1 typu integer [1]=> string(8) "modified" // klíč 1 obsahuje hodnotu modified typu string s délkou 8 znaků [2]=> int(3) // klíč 2 obsahuje hodnotu 3 typu integer } Problém tedy u tebe vyplynul z nepochopení var_dump() výpisu |
||
capricorn Profil |
#15 · Zasláno: 17. 10. 2008, 20:42:07
BetaCam
Problém tedy u tebe vyplynul z nepochopení var_dump() výpisu Konecne to chapu, mam z toho hroznou radost. ;-) Bylo to tim, ze jsem nepochopil var_dump(), kdybych si to dal do print_r(), tak bych to chapal uz odpoledne, proste des, ale dulezite je, ze jsi byl tak hodny a mel se mnou trpelivost. Ale kazdopadne dekuji i vsem ostatnim, ale nejvetsi muj dik patri BetaCamovi, ktery si s tim dal praci a nazorne mne vsechno prevedl. |
||
Časová prodleva: 16 let
|
0