Laravelのコレクションを使っている時に、「Cannot use object of type stdClass as array」というエラーが発生することがある。
このエラーの原因と対処法について。
エラーの原因
エラーの原因は、オブジェクトに対して配列ようにアクセスしたこと。
collectメソッドで生成したコレクション形はオブジェクトであって、配列ではない。このためコレクションのデータに、配列の感覚で、 コレクション名[‘プロパティ名’] としてアクセスしようとするとエラーになる。
例えば、以下のようになコレクションに対して、titleプロパティの値を取得したい場合を考えると
$collect = collect([ "title"=>"Home", "url"=>"https://example.com"])
//$collectの中身
Collection {#2179 ▼
#items: array:4 [▼
0 => {#827 ▼
+"title": "Home"
+"url": "https://example.com"
}
]
}
collect[‘title’]はエラーになる。正しくは、collect->title とする必要がある。
OK | オブジェクト->プロパティ名 |
NG | オブジェクト[‘プロパティ名’] |
形が配列の、「キー=>値」に似ているが、オブジェクトの場合は、キーではなく、「プロパティ: 値」となる。
stdClassとは何か?
エラーの中で表示される、stdClassとはPHPにデフォルトで定義されているクラスのインスタンスのこと。
意味的には、インスタンス=オブジェクトと読み替えて問題ない。(インスタンスはクラスから生成したオブジェクトのこと)
オブジェクト以外(配列など)をオブジェクトに変換した場合に、stdClassというインスタンスが生成される。
配列の場合は、キーがプロパティに自動変換される。それ以外の場合は値が空(null)のオブジェクトとなる。
(参考)PHP公式 オブジェクトへの変換
対処法
対処法は、オブジェクト->プロパティ名 としてアクセスすること。プロパティ名は文字列ではないので、クオテーションは不要。
「->」は、PHPでオブジェクト(インスタンス)のプロパティにアクセスする決まった形。
以下の例における、指定方法と抜き出せる値の関係をまとめると次の表の表になる。
記述 | 取得結果 | 備考 |
---|---|---|
$collect->title | Home | |
$collect->”title” | エラー | syntax error, unexpected ‘”title”‘ |
$collect[‘title’] | エラー | Cannot use object of type stdClass as array |
$collect->url | https://example.com |
$collect = collect([ "title"=>"Home", "url"=>"https://example.com"])
//$collectの中身
Collection {#2179 ▼
#items: array:4 [▼
0 => {#827 ▼
+"title": "Home"
+"url": "https://example.com"
}
]
}