4

ArrayAccess インターフェイスを実装する単純な PHP クラスを作成しました。

class MyArray implements ArrayAccess
{
    public $value;

    public function __construct($value = null)
    {
        $this->value = $value;
    }

    public function &offsetGet($offset)
    {
        var_dump(__METHOD__);

        if (!isset($this->value[$offset])) {
            throw new Exception('Undefined index: ' . $offset);
        }

        return $this->value[$offset];
    }

    public function offsetExists($offset)
    {
        var_dump(__METHOD__);

        return isset($this->value[$offset]);
    }

    public function offsetSet($offset, $value)
    {
        var_dump(__METHOD__);

        $this->value[$offset] = $value;
    }

    public function offsetUnset($offset)
    {
        var_dump(__METHOD__);

        $this->value[$offset] = null;
    }
}

PHP 7 では正常に動作しますが、PHP 5.6 と HHVM で問題が発生します。

isset()未定義のインデックスで関数を呼び出すと、通知offsetGet()の代わりにPHP が呼び出します。offsetExists()Undefined index

PHP 7 では、が返されたoffsetGet()場合にのみ呼び出されるため、エラーは発生しません。offsetExists()true

これはPHP バグ 62059に関連していると思います。

コードは 3V4L で使用できるため、何が問題なのかがわかります。3V4L では通知が表示されないため、インデックスが定義されていない場合はデバッグ呼び出しをいくつか追加し、例外をスローします: https://3v4l.org/7C2Fs

そうしないと、PHPUnit テストが失敗します。このエラーを修正するにはどうすればよいですか?

4

2 に答える 2