【PHP・Laravel】Cannot use object of type stdClass as arrayの原因と対処法|stdClassとは何か?

big-question-mark-with-yang-woman Laravel
記事内に広告が含まれていることがあります。

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->titleHome
$collect->”title”エラーsyntax error, unexpected ‘”title”‘
$collect[‘title’]エラーCannot use object of type stdClass as array
$collect->urlhttps://example.com
$collect = collect([ "title"=>"Home", "url"=>"https://example.com"])

//$collectの中身
Collection {#2179 ▼
  #items: array:4 [▼
    0 => {#827 ▼
      +"title": "Home"
      +"url": "https://example.com"
    }
  ]
}

タイトルとURLをコピーしました