2

SPL ArrayObject を拡張しようとしていますが、ちょっとした問題が発生しました。変更されていない ArrayObject を使用すると、次のコードが機能します。

$a = new ArrayObject();
$a[1][2] = 'abc';
print_r($a);

この出力が得られます:

ArrayObject Object
(
    [storage:ArrayObject:private] => Array
        (
            [1] => Array
                (
                    [2] => abc
                )

        )
)

ただし、ArrayObject を拡張して offsetGet メソッドをオーバーロードすると、

class ExtendedArray extends ArrayObject {
    function offsetGet($i) {
        return parent::offsetGet($i);
    }
}

$a = new ExtendedArray();
$a[1][2] = 'abc';
print_r($a);

その後、次のように失敗します。

ExtendedArray Object
(
    [storage:ArrayObject:private] => Array
        (
        )

)

拡張クラスを多次元配列で機能させるには何が必要ですか?

4

1 に答える 1

1

私にとって、スニペット #1 はかなり壊れており、#2 ではありません。存在しない要素にアクセスしていて、コード #2 はまさに期待どおりの結果を示します: 警告です。#1が「うまくいく」理由は、phpの癖、または2つの癖です。まず、null に []= 演算子を適用すると、この null は「魔法のように」配列に変換されます。インタープリターからの警告は一切ありません。

$a = null;
$a[1] = 'foo'; // "works"
print_r($a); 

第 2 に、これは (意図的かどうかにかかわらず) __get または offsetGet から返される null には適用されません。

class foo {
    function __get($s) { return null; }
}

$a = new foo;
$a->x[1] = 'foo'; // error
print_r($a);  

エラーメッセージには「オーバーロードされたプロパティの間接的な変更」と書かれており、それが何を意味するにせよ、それは良いことです.null値を変更することは決して許可されていません.

于 2010-02-27T20:30:42.973 に答える