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
+
0
-

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?

Majkl578
Moderator | 1364
+
0
-

Na kterém z těch tří užití $uri to padá?

Nepoužíváš náhodou nějaký optimizer PHP (APC/eAccelerator/…)? Uveď verzi PHP a případně i jaký optimizer (a verzi).

hacafrakus
Člen | 14
+
0
-

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)