Zajímavé chování use() v closure
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- hacafrakus
- Člen | 14
Hezký večer,
všiml jsem si zvláštní věci při použití fallbacku u cache. V modelu
mám tento kód:
/**
* Returns static page content
* @param string $uri
* @return string
*/
public function getPage($uri) {
$cache = new Nette\Caching\Cache($this->storage, 'blog.static');
return $cache->load($uri, function() use($uri) {
$page = $this->database->table('pages')
->select('content')
->where('uri', $uri)
->fetch();
if($page) return $page->content;
});
}
Pokud dojde k zavolání fallbacku, skončím na undefined variable $uri. Stačí ale na začátek metody dopsat toto:
$uri = $uri;
A vše funguje jak má. Skoro bych řekl, že toto je bug, protože i na php.net je příklad, kde se do use() zadává přímo proměnná z parametru. Zřejmě to je způsobeno tím, že fallback se zde volá někde jinde (konkrétně v Nette\Caching\Cache), ale co mě zaráží nejvíc je to, že stačí z parametru udělat lokální proměnnou. Mohl by mi, prosím, toto chování někdo objasnit?
- hacafrakus
- Člen | 14
Padá to na tomto řádku:
->where('uri', $uri)
Verze PHP 5.4.9 bez eAcceleratoru, nebo něčeho jiného. PHP jsem kompiloval s touto konfigurací:
./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-pdo-mysql --enable-mbstring --with-mysql --with-curl
Editoval hacafrakus (16. 12. 2012 12:25)