Search code examples
phparrayobject

offsetSet not being called in ArrayObject


Example php code:

class TestArrayObject extends ArrayObject {
    function offsetSet($index,$val){
        echo $index.':'.$val.PHP_EOL;
    }
}

$s = new TestArrayObject();

//test 1
$s['a'] = 'value';//calls offsetSet
//test 2
$s['b']['c'] = 'value';//does not call offsetSet, why?

var_dump($s);

why doesn't test 2 call the offsetSet method?


Solution

  • ArrayObject is a big chunk of magic and thus I wouldn't recommend using it or - even worse - extending it.

    But your actual problem hasn't to do with ArrayObject by itself. What you are running into is that $s['b']['c'] = ...; is a so called indirect modification of the 'b' offset. The code that PHP executes for it looks roughly like this:

    $offset =& $s['b'];
    $offset['c'] = ...;
    

    As you can see offset 'b' is never directly written to. Instead it is fetched by reference and the reference is modified. That's why offsetGet will be called, not offsetSet.