ArrayHash a hodnota klíče je null

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

Dobrý den,

narazil jsem na problém s arrayHash. Když se zeptám funkcí offsetExists na klíč jehož hodnota je null například u degreePostfix vrátí funkce false i když klíč existuje. Nevíte jak tento problém řešit, prosím? Příjde mi totiž, že to je spíš bug a ne standardní chování.

Dík Honza

<script>
Nette\ArrayHash(6) {
   idCustomerOld => "1763" (4)
   degreePrefix => "MUDr." (5)
   firstName => "Renata" (6)
   lastName => "Horká" (6)
   degreePostfix => NULL
   birthday => "03. 02. 1968" (12)
}
</script>
David Grudl
Nette Core | 8228
+
0
-

Podobně se chová i klasické pole. Zkus použít funkci property_exists

Letadlogroup.org
Člen | 5
+
0
-

Děkuji za typ. Jen taková poznámka k zamyšlení. Neměl by ArrayHash být chytřejší než obyčejné pole a toto řešit.

Filip Procházka
Moderator | 4668
+
0
-

Nette\ArrayHash z podstaty imituje pole (a ArrayObject?), takže proč by se měl chovat jinak, než zbytek jazyka?

David Grudl
Nette Core | 8228
+
0
-

Letadlogroup.org napsal(a):

Děkuji za typ. Jen taková poznámka k zamyšlení. Neměl by ArrayHash být chytřejší než obyčejné pole a toto řešit.

isset je funkce, která pro NULL vrací FALSE, tudíž taková chytrost by šla proti principům PHP.

Nox
Člen | 378
+
0
-

Koukajíc na API – jaké je vlastně opodstatnění mít ArrayHash? U Doctrine\Common dejme tomu Collection, poskytuje nějakou funkcionalitu objektovým způsobem

Nevidím, že by ArrayHash poskytoval cokoli, jediný rozdíl od pole asi je, že neprojde array typehintem…

Pojistka na budoucí změny?

Editoval Nox (26. 10. 2011 7:30)

David Grudl
Nette Core | 8228
+
0
-

Má jen dvě vlastnosti:

  • syntaktická: dá se používat zápis $values->item místo $values[‚item‘]
  • přetypovatelnost: (array) $values vytvoří z tohoto objektu odpovídající pole
bene
Člen | 82
+
0
-

Pozor pánové:

<?php

$a = array();
$a[0] = null;
$is = isset($a[0]);
var_dump($is); // false

$a = new ArrayObject;
$a[0] = null;
$is = isset($a[0]);
var_dump($is); // true

PHP mě nikdy nepřestane překvapovat :-D

Filip Procházka
Moderator | 4668
+
0
-

Tak to jsi překvapil i mě! :))

David Grudl
Nette Core | 8228
+
0
-

Dokonce se to v jedné setinkové verzi změnilo.