Autor | Zpráva | ||
---|---|---|---|
joe Profil |
#1 · Zasláno: 29. 7. 2011, 03:14:36 · Upravil/a: joe
Ahoj,
poradíte někdo, jak by měla vypadat metoda __get, abych si umožnil přístup k poli (ty mohou být libovolné, stejně tak zanoření): <?php class Test { private $arr = array( 'foo' => 'bar', 'foo2' => array( 'bar1' => 'a', 'bar2' => 'b', 'bar3' => 'c', ), ); public function __get($name) { /* ... */ } } $test = new Test(); echo($test->arr->foo); // vypsalo by 'bar' echo($test->arr->foo2->bar3); // vypsalo by 'c' Nemůžu se k tomu nějak dostat, půjde to vůbec? Díky |
||
Majkl578 Profil |
#2 · Zasláno: 29. 7. 2011, 06:17:45 · Upravil/a: Majkl578
Když se nad tím logicky zamyslíš, dojdeš k tomu, že to nejde nijak jednoduše. Nejjednodušeji bys toho docílil tak, že bys:
a) neukládal do Test::$arr pole, ale stdClass,
b) v __get rekurzivně konvertoval na objekt (nejspíš stdClass), c) používal ArrayObject .
|
||
joe Profil |
#3 · Zasláno: 29. 7. 2011, 13:25:44 · Upravil/a: joe
Majkl578:
Máš pravdu, ty dvě poslední možnosti mě taky napadly, já jenom jestli by to nešlo i nějak lépe, nechtěl jsem to pořád převádět (na objekty) a tak jsem si udělal pro to radši metodu get($key), kde mam zavedenou tečkovou notaci, díky :-) |
||
Ugo Profil * |
#4 · Zasláno: 29. 7. 2011, 13:48:54
napadla me jenom takovahle prasarna :D ... skoda ty funkce arr() , bez ni netusim vubec protoze napoprvy to __get nezavola :(
class Test { private $tmp; private $arr = array( 'foo' => 'bar', 'foo2' => array( 'bar1' => 'a', 'bar2' => 'b', 'bar3' => 'c', ), ); public function arr() { $this->tmp=$this->arr; return $this; } public function __get($name) { if(empty($this->tmp)) { $this->tmp=$this->{$name}; } else { if(is_array($this->tmp[$name])) { $this->tmp=$this->tmp[$name]; return $this; } else { $ret=$this->tmp[$name]; unset($this->tmp); return $ret; } } } } $test = new Test(); echo($test->arr()->foo); // vypsalo by 'bar' echo($test->arr()->foo2->bar3); |
||
joe Profil |
#5 · Zasláno: 29. 7. 2011, 13:53:32
Ugo:
Jestli jsem to správně pochopil, kde jsem psal, že nemůže být kód :-) private $foo = array( 'foo' => 'foo', ); |
||
Ugo Profil * |
#6 · Zasláno: 29. 7. 2011, 14:04:26
co? :D ted tě nechápu ... ten příklad je spíš taková zajímavost, teoreticky by se nechala třeba při set vytvořit funkce.. tim si teď nejsem jist - nikdy sme to nepotřeboval obdobná tomu názvu proměné..
... btw. vypad mi tma jeden return public function __get($name) { if(empty($this->tmp)) { $this->tmp=$this->{$name}; if(!is_array($this->tmp)) { return $this->tmp; } return $this; } else { if(is_array($this->tmp[$name])) { $this->tmp=$this->tmp[$name]; return $this; } else { $ret=$this->tmp[$name]; unset($this->tmp); return $ret; } } } |
||
Mike8748 Profil |
#7 · Zasláno: 29. 7. 2011, 14:08:55
joe:
hotové řešení je třeba třída Zend_Config, funguje přesně jak popisuješ stačí aby třída Test obsahovala pouze jednu úroveň dat a to jako pole instancí třidy Test. pak __get nebude nijak extra složitá |
||
Časová prodleva: 13 let
|
0