Autor Zpráva
abcdedcba
Profil *
ahoj.
Pokud píšu kód v php tak mám pořád nutkání používat reference např. u tohoto:
$this->funkce($pole); // funkce funkce přečte pole a vrátí nějaký výsledek

automaticky bych psal
function funkce(&$pole)...

Ale nastudoval jsem si, že u php to nemá smysl protože se ve skutečnosti hodnota $pole nekopíruje, jen se na ni automaticky ukáže a pouze pokud bych ji upravoval tak dojde k fyzickému kopírování. Tím se mi ale naskýtá otázka kdy je vlastně vhodné v php reference používat?
Majkl578
Profil
abcdedcba:
Tím se mi ale naskýtá otázka kdy je vlastně vhodné v php reference používat?
Když chceš hodnotu měnit referencí. :)

Obsáhleji: Pokud měníš hodnotu referencí, rozdíl je v tom, že hodnotu nevracíš pomocí return, ale přímo ve funkci změníš hodnotu, tj. $foo = doSomethingOdd($foo) × doSomethingOdd($foo). Praktický význam můžeš nalézt ve chvíli, kdy potřebuješ z volané funkce získat více údajů, např. kromě změněných dat i počet nahrazení řetězce apod. Příkladem budiž funkce preg_replace, která ve svém 5. parametru vrací počet nahrazení referencí.

u php to nemá smysl protože se ve skutečnosti hodnota $pole nekopíruje, jen se na ni automaticky ukáže a pouze pokud bych ji upravoval tak dojde k fyzickému kopírování
Opravdu je to tak. Zajišťuje to interní php typ zval Vysvětlím na příkladu:
$a = 'foo'; //nastavení hodnoty $a
debug_zval_dump($a); //"foo", refcount(2)
$b = $a; //přiřazení hodnoty $a do $b
debug_zval_dump($a); //"foo", refcount(3) - hodnota je interně přiřazená referencí
debug_zval_dump($b); //"foo", refcount(3) - hodnota $b ukazuje na hodnotu $a
$b = 'bar'; //změna hodnoty $b
debug_zval_dump($a); //"foo", refcount(2) - hodnota $b se změnila, reference tedy nadále neexistuje
debug_zval_dump($b); //"bar", refcount(2) - nová, nezávislá hodnota
Refcount je vždy o jedno vyšší, protože jednu referenci vytvoří volání funkce debug_zval_dump.

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:

0