2009-10-08 5 views
11

j'ai écrit une simple classe de collection pour que je puisse stocker mes tableaux dans les objets:PHP array_key_exists() et interface SPL ArrayAccess: non compatible?

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

Problème: lorsque vous appelez array_key_exists() sur cet objet, il retourne toujours « false » car il semble que cette fonction est ne pas être géré par le SPL. Y at-il un moyen de contourner cela?

Preuve du concept:

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

Répondre

19

Ceci est un problème connu qui pourrait être traités dans PHP6. Jusque-là, utilisez isset() ou ArrayAccess::offsetExists().

+1

Merci pour la réponse; pourriez-vous fournir une référence avec cela? –

+3

Je ne crois pas que cela soit écrit n'importe où dans le manuel, parce que ce n'était pas un choix de conception. C'était un oubli de conception, un bug que je pourrais dire. Il y a beaucoup d'incohérences dans le langage PHP. J'ai proposé cette fonctionnalité sur la liste de diffusion interne de PHP, et les gens ont été d'accord avec moi, mais il faudra attendre longtemps avant de la mettre en œuvre. Je ne sais pas C malheureusement. –

+2

Voici un lien vers cette discussion: http://marc.info/?l=php-internals&m=122483924802616&w=2 –

Questions connexes