Autor Zpráva
fasdas
Profil *
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);
}
? Bude při každém volání fce znovu počítat hodnotu toho pole, bude zabírat další místo v paměti i když už bylo jednou toto pole vráceno nebo si to nějak zjistí, že dané pole už v paměti je a nezabere další místo? Děkuji.
Joker
Profil
fasdas:
Vrátí nové pole, samozřejmě.
fasdas
Profil *
A počítá znovu \pow(234, 2) při každém vrácení nebo to spočítá jen jednou?
Alphard
Profil
Pokud vím, pokaždé počítá.
joe
Profil
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 *
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
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 *
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
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
function fce()
{
  static $pole;
  if ($pole === NULL) $pole = array(pow(234, 2), 2);
  return $pole;
}

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: