Используя SplObjectStorage в качестве карты данных, можете ли вы использовать изменяемый массив в качестве данных? - PullRequest
6 голосов
/ 21 февраля 2012

В следующем коде:

$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 в SplObjectStorage не возвращает значения по ссылке.

Есть ли способ использовать SplObjectStorage в качестве карты данных, где ключи - это объекты, а значения - изменяемые массивы? Есть ли другие жизнеспособные варианты для выполнения этой работы?

1 Ответ

6 голосов
/ 21 февраля 2012

Косвенная модификация (т. Е. offsetGet возвращает ссылку) является недавней способностью.См. примечание для ArrayAccess::offsetGet.Похоже, что SplObjectStorage его не использует (пока?).

Я предлагаю вместо этого использовать прямое изменение:

$a = $storage[$fooB];
$a[] = 'test';
$storage[$fooB] = $a;
...