2012-02-21 32 views
6

Trong đoạn mã sau:Sử dụng SplObjectStorage làm bản đồ dữ liệu, bạn có thể sử dụng mảng có thể thay đổi làm dữ liệu không?

$storage = new \SplObjectStorage(); 

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

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

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

Tôi mong chờ $storage[$fooA]1, mà nó được. Tôi cũng mong đợi $storage[$fooB]array('test'), không phải như vậy. Điều này cũng kích hoạt thông báo cho biết, "Sửa đổi gián tiếp phần tử quá tải của SplObjectStorage không có hiệu lực trong ..."

Tôi nghĩ điều này xảy ra vì việc thực hiện ArrayAccess trong SplObjectStorage không trả lại giá trị theo tham chiếu.

Có cách nào để sử dụng SplObjectStorage làm bản đồ dữ liệu trong đó khóa là đối tượng và giá trị là mảng có thể thay đổi không? Có bất kỳ lựa chọn khả thi nào khác để thực hiện loại công việc này không?

Trả lời

6

Sửa đổi gián tiếp (tức là offsetGet trả lại tham chiếu) là một khả năng gần đây. Xem the note for ArrayAccess::offsetGet. Dường như SplObjectStorage không sử dụng nó (chưa?).

Tôi khuyên bạn nên sử dụng sửa đổi trực tiếp thay thế:

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