6

次のコードでは:

$storage = new \SplObjectStorage();

$fooA = new \StdClass();
$fooB = new \StdClass();

$storage[$fooA] = 1;
$storage[$fooB] = array();

$storage[$fooA] = 2;
$storage[$fooB][] = 'test';

私はそうなることを期待$storage[$fooA]します1、それはそうです。私もそうなることを期待$storage[$fooB]しますがarray('test')、そうではありません。これにより、「SplObjectStorageのオーバーロードされた要素の間接的な変更は...に影響を与えません」という通知もトリガーされます。

ArrayAccessこれは、 inの実装がSplObjectStorage参照によって値を返さないために発生すると思います。

SplObjectStorageキーがオブジェクトで値が可変配列であるデータマップとして使用する方法はありますか?この種の作業を行うための他の実行可能なオプションはありますか?

4

1 に答える 1

6

間接的な変更(つまりoffsetGet、参照を返す)は最近の機能です。の注をArrayAccess::offsetGet参照してください。SplObjectStorageがそれを利用しているようには見えません(まだ?)。

代わりに直接変更を使用することをお勧めします。

$a = $storage[$fooB];
$a[] = 'test';
$storage[$fooB] = $a;
于 2012-02-21T16:02:49.957 に答える