ArrayHash a kontrola isset

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

Zdravím,

pokud mám vytáhnuté hodnoty formuláře, který ma kontejnery atd., setkávám se s problémem, který mi dost znepřehledňuje kód – a tím jsou testy na isset.

Normální pole:

$a = Array('bagr' => Array('housle' => Array());
if(isset($a['bagr']['housle']['kytara']['lamplion'])) {} // false v pořádku

ArrayHash:

$a = ArrayHash('bagr' => ArrayHash('housle' => ArrayHash()); // pseudozadání
if(isset($a['bagr']['housle']['kytara']['lamplion'])) {} // Notice Undefined property: Nette\ArrayHash::$kytara
/*
File: .../web/libs/Nette/common/ArrayHash.php   Line: 91

84:        /**
85:         * Returns a item.
86:         * @param  mixed
87:         * @return mixed
88:         */
89:        public function offsetGet($key)
90:        {
91:            return $this->$key;
92:        }
*/

Nebylo by dobré toto chování nějak sjednotit? V nynějším stavu mě to nutí dělat nepřehlednosti typu:

if(
    isset($a['bagr'])
    && isset($a['bagr']['housle'])
    && isset($a['bagr']['housle']['kytara'])
    && isset($a['bagr']['housle']['kytara']['lamplion'])
) {}

Nedá se to chytat ani exceptionama, navrhoval bych, aby to házelo třeba exception co jde chytit.

edit: Koukám že, nejnovější Nette má možnost to vrátit jako pole, tak si to tak asi taky implementuju do staršího Nette 2.0.

Editoval Ascaria (29. 3. 2012 12:29)

Aurielle
Člen | 1281
+
0
-

Vždycky si můžeš ArrayHash na array přetypovat…

duke
Člen | 650
+
0
-

@gmvasek To bohužel není tak snadné, protože prosté přetypování ti na array nepřevede vnořené ArrayHashe. Nicméně jak si již Ascaria všimnul, metoda Form::getValues umí vracet i pole.

Ascaria
Člen | 187
+
0
-

@gmvasek: Ano, tak jsem to i udělal zpočátku, ale to pak dost znepřehledňovalo kód.

@duke: Nette co tu mám neuměla, musel jsem to okoukat z novějšího nette a implementovat sám, ale hlavní je že už umí :)