くわこのpermission denied.

WEBエンジニアの僕がぶつかった技術的な問題や発見

Notice: Indirect modification of overloaded property Hoge::$page has no effectという見たこと無いエラーが出た。

foreach内でオブジェクトに配列を代入しようとしたら

Notice: Indirect modification of overloaded property Foo::$bar has no effect

という初めて見たエラーが出たので調べてみた。

どういう状況で起きたかというと、コメントリストをforeachで回してそのコメントがユーザーidと一緒だったらそのユーザーのcomment_listっていうプロパティ(配列)にそのコメントを入れますよっていう感じのソース。

foreach ($comments as $comment) {
  if ($user->user_id === $comment->user_id) {
    $user->comment_list[] = $comment;
  }
}


で以下の記事を見つけてなるほどってなった。

blog.ISHINAO.net | PHPで__setを使ったプロパティに対する配列要素の追加


今回の例をまとめると

PHP 5以降で__get()、__set()を使ってプロパティオーバーロードし、プロパティがarray型の値を持つ場合、それに対して利用できる演算子は制約を受ける($foo->bar[]= 〜や$foo->bar[$hoge] = 〜などは使えない)

ということらしい。なるほど。
なので僕は緊急回避的な策として

foreach ($comments as $comment) {
  $comment_list = [];
  if ($user->user_id === $comment->user_id) {
    $comment_list[] = $comment;
  }
}
$user->comment_list = $comment_list;

みたいな感じで書きましたが、もっとちゃんとしたかっこいい書き方あると思うので誰か教えてください。