Используя SplObjectStorage в качестве карты данных, можете ли вы использовать изменяемый массив в качестве данных?
В следующем коде:
$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 ответ
Косвенная модификация (т.е. offsetGet
возвращение ссылки) является недавней способностью. Смотрите примечание дляArrayAccess::offsetGet
, Похоже, что SplObjectStorage его не использует (пока?).
Я предлагаю вам использовать прямую модификацию вместо:
$a = $storage[$fooB];
$a[] = 'test';
$storage[$fooB] = $a;