11
napisałem prostą klasę kolekcji, dzięki czemu można przechowywać swoje tablice w obiektach:PHP array_key_exists() i interfejs SPL ArrayAccess: niezgodny?
class App_Collection implements ArrayAccess, IteratorAggregate, Countable
{
public $data = array();
public function count()
{
return count($this->data);
}
public function offsetExists($offset)
{
return (isset($this->data[$offset]));
}
public function offsetGet($offset)
{
if ($this->offsetExists($offset))
{
return $this->data[$offset];
}
return false;
}
public function offsetSet($offset, $value)
{
if ($offset)
{
$this->data[$offset] = $value;
}
else
{
$this->data[] = $value;
}
}
public function offsetUnset($offset)
{
unset($this->data[$offset]);
}
public function getIterator()
{
return new ArrayIterator($this->data);
}
}
Problem: Dzwoniąc array_key_exists() na tym obiekcie, to zawsze wraca „false”, jak się wydaje ta funkcja jest nie jest obsługiwane przez SPL. Czy jest jakiś sposób obejścia tego?
Dowód koncepcji:
$collection = new App_Collection();
$collection['foo'] = 'bar';
// EXPECTED return value: bool(true)
// REAL return value: bool(false)
var_dump(array_key_exists('foo', $collection));
Dzięki za odpowiedź; czy możesz podać referencję? –
Nie wierzę, że jest to napisane gdziekolwiek w instrukcji, ponieważ nie było to wyborem projektu. To był błąd w projektowaniu, błąd, który mógłbym powiedzieć. Istnieje wiele niespójności w języku PHP. Zaproponowałem tę funkcjonalność na liście mailowej internalsów PHP, a ludzie się ze mną zgodzili, ale minie jeszcze sporo czasu, zanim zostanie ona zaimplementowana. Nie znam C niestety. –
Oto link do tej dyskusji: http://marc.info/?l=php-internals&m=122483924802616&w=2 –