Autor | Zpráva | ||
---|---|---|---|
Karlos Profil * |
#1 · Zasláno: 27. 6. 2012, 16:28:26
Ahoj chci se zeptat, viděl jsem občas v nějakém kodu něco takovéhleho:
$instance = new Class(); $nejaka_promena = &$instance; nebo třeba public function Metoda(&$instance) Na co se tam dává to &? A jaký je rozdíl když to tam nedám? Díky |
||
Beavis Profil |
Karlos:
IMHO je to pozůstatek z PHP 4. |
||
Karlos Profil * |
#3 · Zasláno: 27. 6. 2012, 16:36:06
a co to znamená?
|
||
ShiraNai7 Profil |
#4 · Zasláno: 27. 6. 2012, 16:37:31
Beavis:
„IMHO je to pozůstatek z PHP 4.“ Používat operátor & v kontextu s vytvářením instancí je zastaralý (deprecated) postup. Ale jinak slouží pro vytváření/deklaraci referencí - a to není žádný pozůstatek. |
||
Tori Profil |
#5 · Zasláno: 27. 6. 2012, 17:50:27
Karlos:
Pro doplnění odkaz na info, jak fungují reference: http://sk.php.net/manual/en/language.references.php |
||
xxar3s_ Profil * |
#6 · Zasláno: 27. 6. 2012, 18:39:15
v pripade instancii to nema zmysel pretoze to su referencne datove typy.
zmysel to ma u hodnotových typov(cisla, stringy, v PHP aj polia): <?php $a = 1; $b = &$a; //$b je referencia na $a $b = 2; echo $a; //vypíše 2 $b ukazuje na rovnake miesto v pamati ako $a to znamena ze ked zmenis $b zmeni sa aj $a |
||
Majkl578 Profil |
xxar3s:
„v pripade instancii to nema zmysel pretoze to su referencne datove typy“ To není tak úplně pravda. Podívej se na tento kód, který vyvrací tvé tvrzení: $a = new \stdClass(); $b = $a; $b = new \stdClass(); $c = &$a; var_dump($a === $b); // FALSE var_dump($a === $c); // TRUE $c = new \stdClass(); var_dump($a === $c); // stále TRUE |
||
Tori Profil |
Majkl578:
K čemu je řádek č.3? Jinak zajímavá věc - zkuste na ř.11 a 13 pojmenovat proměnnou jinak než $c a na ř.13 vyjde FALSE. Stejně (tedy výsledek FALSE) se to chová, pokud na řádek č.10 dáte unset($c) .
Nějak nechápu, jaký je rozdíl v přiřazení instance do prázdné proměnné a do proměnné obsahující [jinou] instanci téže třídy. A jo, konečně mi to (při krájení hub) došlo. Berte tenhle příspěvek jako bezpředmětný. |
||
Jan Tvrdík Profil |
#9 · Zasláno: 27. 6. 2012, 21:31:06
Majkl578 ten příklad trochu divně seřadil. Když to přeskládám takto, tak to bude jasnější.
$a = new stdClass(); $b = $a; // obyčejná kopie $c = &$a; // reference var_dump($a === $b); // TRUE var_dump($a === $c); // TRUE // změníme hodnotu $b = new stdClass(); $c = new stdClass(); var_dump($a === $b); // FALSE var_dump($a === $c); // TRUE |
||
SeparateSK Profil |
Referencie sa ti oplatia použiť vtedy, ak chceš aby sa zmeniť viac premenných naraz použitím funkcie iba 1 raz
Príklad zmeny viacerých premenných naraz s použitím referencií: <?php function zmen(&$a,&$b,&$c){ $a=$a*5; $b=$b*5; $c=$c*5; //nemusi sa pouzit return; } $a=1; $b=3; $c=5; zmen($a,$b,$c); echo "$a , $b , $c"; ?> <?php function zmen($a){ $a=$a*5; return $a; } $a=1; $b=3; $c=5; $a=zmen($a); $b=zmen($b); $c=zmen($c); echo "$a , $b , $c"; ?> |
||
Keeehi Profil |
SeparateSK:
Což o to, ale hlavně se data nakopírují -> menší paměťová náročnost. function foo1 ( $bar1 ) { return $bar1."\n"; } $data = file_get_contents("data.txt"); $data = foo1 ( $data ); function foo2 ( &$bar2 ) { $bar2 .= "\n"; } $data = file_get_contents("data.txt"); foo2 ( $data ); To jedno jedno jediné & způsobí, že pokud soubor data.txt má velikost třeba 10MB, tak se alokovaná paměť 2. scriptu bude jen cca 10MB místo 20BM, které by potřeboval 1. script |
||
Alphard Profil |
[#10] SeparateSK
V PHP to není obvyklá praxe, raději bych to moc nepoužíval. [#11] Keeehi Tak ne, zmátl mě tvůj zápis $data = foo2 ( $data ); |
||
Keeehi Profil |
#13 · Zasláno: 28. 6. 2012, 23:55:02
Alphard:
„Ta funkce nemá return, je to dost zavádějící.“ Už jsem to upravil. Ano, bylo to zavádějící. I když na funkčnost to nemá vliv, nemá to tam co dělat. |
||
Časová prodleva: 12 let
|
0