It's worth notting that ArrayObject::exchangeArray() doesn't call ArrayObject::offsetSet() internally for each offset/property of the array/object provided in argument.It's also worth noting the let's say "unexpected" behavior of get/set:<?phpclass MyArrayObject extends ArrayObject{ public function offsetSet($name, $value) { parent::offsetSet($name . '_control', $value); parent::offsetSet($name, $value); }}$test = new MyArrayObject();$test->setFlags(\ArrayObject::ARRAY_AS_PROPS);$test['my_value_1'] = 1;$test['my_value_1'] = $test['my_value_1'] + 1;$test['my_value_1'] += 1;$test['my_value_1'] ++;++ $test['my_value_1'];$test->my_value_2 = 1;$test->my_value_2 = $test->my_value_2 + 1;$test->my_value_2 += 1;$test->my_value_2 ++;++ $test->my_value_2;print_r($test);// Prints out:MyArrayObject Object( [storage:ArrayObject:private] => Array ( [my_value_1_control] => 3 [my_value_1] => 5 [my_value_2_control] => 2 [my_value_2] => 5 ))?>