Autor | Zpráva | ||
---|---|---|---|
fasdas Profil * |
#1 · Zasláno: 25. 12. 2010, 23:38:31
Ahoj. Nevíte někdo jak funguje phpčko uvnitř pokud má třeba zpracovat např. fci:
function fce() { return array(\pow(234, 2), 2); } |
||
Joker Profil |
#2 · Zasláno: 26. 12. 2010, 00:09:41
fasdas:
Vrátí nové pole, samozřejmě. |
||
fasdas Profil * |
#3 · Zasláno: 26. 12. 2010, 01:01:18
A počítá znovu \pow(234, 2) při každém vrácení nebo to spočítá jen jednou?
|
||
Alphard Profil |
#4 · Zasláno: 26. 12. 2010, 01:09:49
Pokud vím, pokaždé počítá.
|
||
joe Profil |
#5 · Zasláno: 26. 12. 2010, 01:33:40
Pokud bych nechtěl, aby se znovu provádělo tělo té funkce, uložil bych výsledek do statické proměnné.
|
||
fasdas Profil * |
#6 · Zasláno: 26. 12. 2010, 12:22:10
function fce() { static $pole = array(\pow(234, 2), 2); return $pole; } Stačí? Co pokud by byla fce součástí "statické" třídy? Je čistější řešení uchovávat $pole jako proměnnou třídy (s tím že bych jí musel nějakou statickou fcí nejprve inicializovat kvůli tomu \pow) nebo jako statickou proměnnou samotné fce? |
||
imploder Profil |
#7 · Zasláno: 26. 12. 2010, 16:35:33
Joker:
„Vrátí nové pole, samozřejmě.“ Samozřejmé to úplně není, dobré překladače umí tyhle věci (výpočet se všemi hodnotami konstantními) automaticky optimalizovat a nahradí je rovnou výsledkem. PHP ale, protože je to interpretovaný jazyk (neexistuje binárka ani se neukládá žádný bajtkód - pokaždé se jede přímo ze zdrojáku), tyhle věci asi nedělá (i když jistý si tím nejsem). Máš o tom nějaké bližší info, nebo sis jenom tipl? fasdas: „Stačí?“ Řekl bych, že nestačí, protože přiřazení se provede při každém zavolání funkce. "static" znamená, že se hodnota proměnné zachová mezi voláními funkce. Její hodnota se ale měnit může, neznamená to, že by to byla konstanta. Ten příklad mi dává chybu ("Parse error: syntax error, unexpected '(', expecting ',' or ';' ") na řádku s přiřazením (static $pole = array(\pow(234, 2), 2);) a nevím proč. |
||
fasdas Profil * |
#8 · Zasláno: 26. 12. 2010, 16:57:04
imploder:
„Řekl bych, že nestačí, protože přiřazení se provede při každém zavolání funkce. "static" znamená, že se hodnota proměnné zachová mezi voláními funkce. Její hodnota se ale měnit může, neznamená to, že by to byla konstanta.“ To si trošku protiřečí, ne? Pokud se hodnota přiřadí po každém spuštění fce, tak se nezachová. Konečně jsem našel něco v češtině: http://php.vetrelec.net/14_funkce.php a tam se to tak popisuje. Nicméně static ve fci trpí asi stejným "neduhem" jako prostá proměnná ve třídě - nelze v ní provádět žádné operace, proto ta chyba. Takže asi jediným řešením bude inicializovat pole mimo fci (ve třídě použít speciální fci pro inicializaci pole) a mimo třídu definovat pole vně fce že? |
||
imploder Profil |
#9 · Zasláno: 26. 12. 2010, 17:03:22
fasdas:
Neprotiřečí si to. Hodnota se sice zachová, ale navíc se tam pokaždé ještě bude (zbytečně) znovu přiřazovat. V těch příkladech, kde se statická proměnná používá jako počítadlo, se zachová a vždycky se jen zvýší o 1. Takže konstantní není. Prostě je to pořád ta samá proměnná - jako kdyby byla globální, jen s tím rozdílem, že je přístupná jen zevnitř fce(). Když do ní funkce přiřazuje, tak se do ní prostě pokaždé znovu přiřadí - pokaždé to samé. |
||
Jan Tvrdík Profil |
#10 · Zasláno: 26. 12. 2010, 18:24:16
function fce() { static $pole; if ($pole === NULL) $pole = array(pow(234, 2), 2); return $pole; } |
||
Časová prodleva: 13 let
|
0