Autor Zpráva
xlifer
Profil
Jaký nejvhodnější (správný) způsob zvolit pro předání array pole do funkce? A jaký je rozdíl z hlediska výkonu a nároků na paměť? Předem děkuji za reakce.

Verze 1:

<?php
function nejakaFunkce(array $pole) {
echo $pole[1];
}
$pole = array();
$pole[1] = "neco";
nejakaFunkce($pole);
?>

Verze 2:

<?php
function nejakaFunkce() {
global $pole;
echo $pole[1];
}
$pole = array();
$pole[1] = "neco";
nejakaFunkce($pole);
?>

Verze 3:

<?php
function nejakaFunkce() {
echo $GLOBALS["neco"][1];
}
$pole = array();
$pole[1] = "neco";
nejakaFunkce();
?>
Kcko
Profil
Jedině 1. Funkce má příjimat argumenty, vyžaduje-li to a rozhodně ne přes globální proměnné (je to akorát tak jedna velká prasárna).
Keeehi
Profil
xlifer:
První je správná. Druhá a třetí jsou ekvivalentní a naprosto nevhodné. Že existuje slovo global v PHP můžeš pro vlastní dobro zapomenout.

Ještě je jedna varianta
<?php
function nejakaFunkce(array &$pole) {
echo $pole[1];
}
$pole = array();
$pole[1] = "neco";
nejakaFunkce($pole);
?>
V prvním případě se vytvoří kopie pole a ta se předá dovnitř funkce. V tomto případě se uvnitř pracuje přímo s polem z venku. Což má za důsledek, že jakoukoli změnu provedeš uvnitř funkce, tak se projeví i na tom poli mimo funkci. Což je tedy i případ verze 2 a 3. Jelikož se nevytváří kopie, může být tato varianta rychlejší. Pokud se ale nejedná o obrovská pole, bude lepší použít variantu 1, jelikož nemusíš hlídat, zda uvnitř něco měníš a zda to vadí.
xlifer
Profil
Keeehi:
Rozumím a děkuji za reakci. Pokud tedy na 100% vím, že uvniř funkce array pole používám pouze v režimu pro čtení, tak můžu s klidem použít předání přes ampersand, protože bude rychlejší, což je logické, když není nutné sestavit kopii. Je na tom pěkné i to, že lze pouhým odebráním ameprsandu, změnit na původní variantu 1, vytvoření kopie, takže lze kód velmi elegantně změnit dle potřeby. To se mi libí.
Alphard
Profil
Keeehi:
Jelikož se nevytváří kopie, může být tato varianta rychlejší.
To není pravda, PHP interně kopii neudělá, dokud není potřeba. Dokud se pole (nebo i jiná proměnná, např. dlouhý string) pouze čte, je interně taktéž referencováno.
Tudíž reference v PHP mají smysl pouze pokud chceme modifikovat danou proměnnou.

xlifer [#4]:
Ne, ne a ne :). Takové to „když na 100 % vím“ vůbec neuvažuj, nikdy nevíš, jak se kód vyvine a tohle je nebezpečné místo. PHP nemá podporu pro const & (které by se v této situaci bezpečně použilo v C++), protože nic takového není potřeba, viz moje reakce na Keeehiho.
Keeehi
Profil
Alphard:
Jo, nějak tak to vlastně bylo. Jsem si říkal, že bych si to měl raději otestovat :)
Alphard
Profil
Keeehi [#6]:
To nebudu nutné, já se jen bál, aby nevznikala doporučení na optimalizaci kodu referencováním dvouprvkového pole apod.
Všechno jde najít, ale pro úplnost doplním, že David to otestoval už před 11 lety - phpfashion.com/php-cerna-magie-optimalizace a phpfashion.com/php-puvab-optimalizace-rychlosti. A mezitím se v dokumetnaci objevil hezký článek php.net/manual/en/features.gc.refcounting-basics.php, který to vše detailně popisuje.

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: