質問

私は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
        (
        )

)

それは多次元配列で私の拡張クラスの仕事をするために取る何?

役に立ちましたか?

解決

私にとっては、スニペットの#1がかなり壊れている、ではない#2。あなたは存在しない要素にアクセスしている、とコード#2は1つが期待するまさにあなたを与える:警告。 #1はちょっと「作品」理由は気まぐれ、またはPHPの2つの癖です。あなたが適用されたときにまず、[] = nullの上のオペレータは、このヌルは「魔法」の配列になっている - インタプリタからの警告の一つの言葉もなく。

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

第二に、この(意図的かどうか)__get又はoffsetGetから返さヌルには適用されない。

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

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

エラーメッセージは、「オーバーロードされた財産の間接的な変更」と言い、そして、どんなことを意味し、それは良いことだ - あなたはどのような方法でヌル値を変更することはできませんしている。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top