Měla by metoda offsetExists v Nette\ArrayHash kontrolovat existenci klíče
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- akadlec
- Člen | 1326
Co si myslíte o této metodě v ArrayHash?
/**
* Determines whether a item exists.
* @return bool
*/
public function offsetExists($key)
{
return isset($this->$key);
}
nebylo by vhodnější kdyby se místo isset použilo array_key_exists ? protože isset jaksi reaguje na NULL tak že vrátí false že, ale co když je hodnota NULL validní hodnota v poli?
- besanek
- Člen | 128
Klíč nemůže být NULL
.
/**
* Replaces or appends a item.
* @return void
*/
public function offsetSet($key, $value)
{
if (!is_scalar($key)) { // prevents NULL
throw new Nette\InvalidArgumentException(sprintf('Key must be either a string or an integer, %s given.', gettype($key)));
}
$this->$key = $value;
}
- Zax
- Člen | 370
Na tohle jsem už v minulosti taky trochu zíral a zjistil jsem, že tento problém je popsán v článku od Jakuba Vrány – http://php.vrana.cz/…kdy-null.php. Problém je v tom, že když se použije array_key_exists, tak to vede k jakoby nekonzistentnímu chování (zkopírováno z Jakubova článku):
class ReadOnly {
protected $readOnly = array("set" => 1, "null" => null);
function __isset($name) {
return array_key_exists($name, $this->readOnly);
// return isset($this->readOnly[$name]);
}
function __get($name) {
return $this->readOnly[$name];
}
}
if (isset($readOnly->null)) { // true
$null = $readOnly->null;
var_dump(isset($null)); // false
}
K tomu ještě Jakub dodává: „Obvykle je tedy lepší v metodě __isset zachovat běžné chování a pro zjištění samotné existence zavést speciální metodu. Totéž se týká i metody offsetExists.“
Editoval Zax (30. 12. 2014 22:27)