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 |
#2 · Zasláno: 14. 7. 2017, 21:04:15
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 |
#3 · Zasláno: 14. 7. 2017, 21:12:11
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); ?> |
||
xlifer Profil |
#4 · Zasláno: 14. 7. 2017, 21:28:38
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 |
#5 · Zasláno: 14. 7. 2017, 22:57:30
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 |
#6 · Zasláno: 14. 7. 2017, 23:19:16
Alphard:
Jo, nějak tak to vlastně bylo. Jsem si říkal, že bych si to měl raději otestovat :) |
||
Alphard Profil |
#7 · Zasláno: 14. 7. 2017, 23:37:23
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. |
||
Časová prodleva: 7 let
|
0