Hashtable přístup pomocí ->name

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
kutilm
Člen | 21
+
0
-

Ahoj,
chtěl jsem použít Hashtable a přístup k položkám pomocí ->name, ale nějak to nefunguje, přístup přes ['name'] je funkční.

<?php
  $arr = array('a' => 'jedna', 'b' => 'dve',  'c' => 'tri');
  $hashtable = new Hashtable($arr);

  Debug::dump($hashtable['a']);
     //string(5) "jedna"
  Debug::dump($hashtable->a);
     //MemberAccessException: Cannot read an undeclared property Hashtable::$a.
?>

Poradíte, kde dělám chybu, nebo přístup přes ->name není možný?
 Děkuji

PetrP
Člen | 587
+
0
-

Hashtable přístup přes properties nemá.

Nicmnéně ArrayObject má flags v constructoru a ArrayObject::setFlags()
Hashtable sice constructor bohužel přepisuje ale možnost přes setflags existuje:

$h = new Hashtable(array(
'a'=>1,
'b'=>1,
'c'=>1,
'd'=>1,
'e'=>1,
));
$h->setFlags(ArrayObject::ARRAY_AS_PROPS); // nebo jen $h->setFlags(2);
d($h['a']);
d($h->a);

Nebo můžes použít třeba Config které si pro to podporu samo vytváří ;]

kutilm
Člen | 21
+
0
-

Dík,
Config je fajn.

Ještě se zeptám, Hashtable nemá přístup přes properties, protože to ještě není implementováno, nebo se s tím nepočítá?

Děkuji

PetrP
Člen | 587
+
0
-

Když jsem psal že u Hashtable to zapneš takto:

$hashtable->setFlags(ArrayObject::ARRAY_AS_PROPS);

Je to vlastnost ArrayObject což je předek hashtable; není to uplně nejpohodlnější, ale funkční.

Třeba se david vyjádrí jestli by nechtěl dát tu možnost jako třetí parametr do Collection::__construct() kde to přepisuje z ArrayObject::__construct(). Případně jí zapnout defaultně (jestli to není zabyják výkonu), nebo u hastable přidat __get a __set jako má Config.