Přístup k array položkám v Cache jako k poli nebo fluent interface
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Milo
- Nette Core | 1283
Neimplementoval jste někdo něco podobného?
<?php
$storage = new FileStorage( TMP_DIR . '/Box' );
$cache = new Cache( $storage );
$cache->save( 'persons', array(), array( 'tags' => array('sql') );
$cache['persons'][ $personId ] = 'xxxxx'; // toto nelze
// Anebo fluent?
$cache->persons[ $personId ] = 'xxxx'; // taktez nelze
?>
Zkrátka aby se Cache
objekt choval jako
Session
.
- David Grudl
- Nette Core | 8228
Přístup k $cache['persons']
znamená čtení/zápis do cache.
Obecně tedy pomalá operace se kterou je třeba šetřit. Byl by průšvih,
kdyby programátoři začali psát něco takového:
$cache['persons'][ $personId ] = 'xxxxx';
$cache['persons'][ $xxx ] = 'xxxxx';
$cache['persons'][ $yyy ] = 'xxxxx';
I čistě z technické stránky to realizovatelné není, protože
$cache['persons']
tady představuje čtení, tj. načte se pole,
tomu se upraví položka $personId a … už nic. Není tam
žádný zápis.
- Milo
- Nette Core | 1283
Já jsem si říkal že
Indirect modification of overloaded element of Cache has no effect
tam není jen tak, jen jsem nerozuměl…
V aplikaci zápis do cache často neprovádím. Používám ji pro cachování SQL výsledků.
<?php
if( !isset( $cache['persons'][ $personId ] ))
{
$tmp = $cache['persons'];
$tmp[ $personId ] = $db->query("... WHERE person_id = ...")->fetchAssoc(...);
$cache['persons'] = $tmp;
}
?>
Tak jsem si to chtěl ulehčit na:
<?php
if( !isset( $cache['persons'][ $personId ] ))
{
$cache['persons'][ $personId ] = $db->query("... WHERE person_id = ...")->fetchAssoc(...);
}
?>
Editoval Milo (24. 8. 2010 16:45)