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

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

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

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)