Я понимаю, почему
$a = new ArrayObject();
$a['ID'] = 42;
$b = &$a['ID'];
$c = $a;
$c['ID'] = 37;
echo $a['ID']."\n";
echo $b."\n";
echo $c['ID']."\n";
выходы 37, 42, 37
а
$a = new ArrayObject();
$a['ID'] = 42;
$b = &$a['ID'];
$c = $a;
$b = 37;
echo $a['ID']."\n";
echo $b."\n";
echo $c['ID']."\n";
выходы 37, 37, 37
В обоих случаях $b является ссылкой на $a['ID'], а $c является указателем на тот же объект, что и $a.
Когда $b изменяет $a['ID'] и $c['ID'] изменение, потому что назначение $b изменяет значение, на которое ссылается $a['ID'].
Когда $c['ID'] изменяется, новый int присваивается $a['ID'], $b больше не ссылается на $a['ID'].
Но это меня мешает
$a = new ArrayObject();
$a['ID'] = 42;
$b = &$a['ID'];
$c = $a;
$c['ID'] &= 0;
$c['ID'] |= 37;
echo $a['ID']."\n";
echo $b."\n";
echo $c['ID']."\n";
(выходы 37, 37, 37)
Это определенное поведение? Я ничего не видел об этом в документации...