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;
みたいな感じで書きましたが、もっとちゃんとしたかっこいい書き方あると思うので誰か教えてください。