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
+
+1
-

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
+
-1
-

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;
	}
akadlec
Člen | 1326
+
0
-

ehm asi sem špatně vyjádřil, samozřejmě nechci aby klíč byl null ale hodnota klíče

$pole = [
	'klic1'	=> 'hodnota',
	'klic2'	=> NULL
];
besanek
Člen | 128
+
0
-

Ah, sorry. Už vidím v čem je zakopaný pes. Jsem po Vánocích nějak zabržděný.

Zax
Člen | 370
+
+2
-

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)