2009-10-08 2 views
11

PHPのarray_key_exists()とSPL ArrayAccessインターフェイス:互換性がありません?私は、オブジェクトに私の配列を格納できるように、私はシンプルなコレクションクラスを書いた

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

問題:この機能があると思われるよう呼び出すarray_key_exists()このオブジェクトには、それは常に「false」を返しますSPLによって処理されません。これを回避する方法はありますか?コンセプトの

証明:

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

答えて

19

これは PHP6で対処されるかもしれない既知の問題です。これまでは、isset()またはArrayAccess::offsetExists()を使用してください。

+1

回答ありがとうございます。それを参考にしてもらえますか? –

+3

これはデザインの選択肢ではなかったため、マニュアルのどこにでも書かれているとは思いません。それは設計監督で、私が言うかもしれないバグです。 PHP言語には多くの矛盾があります。私はPHPの内部メーリングリストでこの機能を提案し、人々は私に同意しましたが、実装されるまでには長い時間がかかるでしょう。私は残念ながらCを知らない。 –

+2

ここにそのディスカッションへのリンクがあります:http://marc.info/?l=php-internals&m=122483924802616&w=2 –

関連する問題