Autor Zpráva
Karlos
Profil *
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 *
a co to znamená?
ShiraNai7
Profil
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
Karlos:
Pro doplnění odkaz na info, jak fungují reference: http://sk.php.net/manual/en/language.references.php
xxar3s_
Profil *
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
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";
?>
Bez referencií:
<?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
Jsi si jistý? Myslím, že se to nezkopíruje, dokud tu proměnnou nezměníš. Takže ani první případ nebude kopírovat.
Tak ne, zmátl mě tvůj zápis
$data = foo2 ( $data );
Ta funkce nemá return, je to dost zavádějící.
Keeehi
Profil
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.

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: