これは一種の「落とし穴」です。なぜなら、予想される動作は OP に記載されているとおりになると思うからです。
さらに、オブジェクトまたは配列として ArrayObject にアクセスするときの動作は一貫していません。
例:
$foo['b']['c'] = 'value'; // no warning
var_dump($foo);
$bar->b->c = 'value'; // triggers warning
var_dump($bar);
ArrayObject を拡張する独自のクラスでも同じ問題が発生していました。この問題を修正することはできませんでしたが、プロパティの作成を連鎖させるために使用する新しい方法を実装することで、問題を回避することができました。
class Arraylist extends ArrayObject
{
public function set($key, $value = null)
{
if (!is_null($value)) {
$val = new ArrayList((array) $value);
} else {
$val = new ArrayList();
}
$this->offsetSet($key, $val);
return $this->offsetGet($key);
}
public function offsetSet($index,$val){
echo $index.':'.$val.PHP_EOL;
parent::offsetSet($index, $val);
}
}
OP の例を使用します。
コード:
$s = new ArrayList();
$s->set('a', 'value');
$s->set('b')->set('c', 'another value');
var_dump($s);
出力:
0:value
a:ArrayList
0:value
b:ArrayList
0:another value
c:ArrayList
0:another value
class ArrayList#5 (2) {
public $a =>
class ArrayList#7 (1) {
string(5) "value"
}
public $b =>
class ArrayList#8 (1) {
public $c =>
class ArrayList#9 (1) {
string(13) "another value"
}
}
}