2009-10-08 13 views
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)); 

Odpowiedz

19

Jest to znany problem, który może być skierowana w PHP6. Do tego czasu używaj isset() lub ArrayAccess::offsetExists().

+1

Dzięki za odpowiedź; czy możesz podać referencję? –

+3

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. –

+2

Oto link do tej dyskusji: http://marc.info/?l=php-internals&m=122483924802616&w=2 –