2009-10-08 11 views
11

Basit bir toplama sınıfı yazdım, böylece dizilerimi nesnelerde saklayabilirim:PHP array_key_exists() ve SPL ArrayAccess arayüzü: uyumlu değil misiniz?

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); 
    } 
} 

Sorun: array_key_exists() öğesini bu nesnede çağırırken, bu işlev görünmediği için her zaman "false" döndürür SPL tarafından ele alındı. Bunun etrafında bir yolu var mı?

Kavram kanıtı:

$collection = new App_Collection(); 
$collection['foo'] = 'bar'; 
// EXPECTED return value: bool(true) 
// REAL return value: bool(false) 
var_dump(array_key_exists('foo', $collection)); 

cevap

19

Bu PHP6 konu edilebilecek olan bilinen bir sorundur. O zamana kadar isset() veya ArrayAccess::offsetExists()'u kullanın.

+1

Cevabınız için teşekkürler; Bununla ilgili bir referans verebilir misiniz? –

+3

Bunun el kitabında herhangi bir yere yazıldığına inanmıyorum çünkü bir tasarım seçimi değildi. Tasarım gözetimiydi, söyleyebileceğim bir böcek. PHP dilinde birçok tutarsızlık vardır. PHP internals mail listesindeki bu işlevselliği önerdim ve insanlar benimle hemfikir oldular, ancak uygulanana kadar uzun bir zaman olacak. Ne yazık ki C'yi bilmiyorum. –

+2

İşte bu tartışmanın bir bağlantısı: http://marc.info/?l=php-internals&m=122483924802616&w=2 –