Exception: Cannot use object of type stdClass as array
Cannot use object of type stdClass as array について
phpのエラー。「Cannot use object of type stdClass as array」
オブジェクトに対して、配列の処理を加えようとしたときに出るエラー。
csv辺りを触ってたら遭遇したエラー。オブジェクトで書かれてたものに対して配列でどうにかこうにかしようとしてた。
stdClassとは
ここでまずstdClassとはなんぞ…?と疑問に思った。調べると、中身が空っぽの、未定義のクラスとある。オブジェクトの型変換で作られるということだが、なんのことか。PHPマニュアルを見ると以下のように書かれてある。
オブジェクトがオブジェクトに変換される場合はなにも修正されません。 オブジェクト以外の型の値がオブジェクトに変換される時には、
「オブジェクトへの変換」(2021/2/17最終閲覧)https://www.php.net/manual/ja/language.types.object.php#language.types.object.castingstdClass
というビルトインクラス(予めPHPの内部で定義されているクラス)のインスタンスが新しく生成されます。 その際、値が null の場合は新しいインスタンスは空となります。 また、配列がオブジェクトに変換される場合、配列のキーと値がそれぞれオブジェクトのプロパティ名とその値となります
自分のケースは「オブジェクトを配列に変換しようとして、その過程でphpさんが未定義のクラスを作ってくれた。でも、中身が何もないものに対してなんかしようとしてたから、エラーを出した」てことで、冒頭のエラーが出た感じ。
解決
たとえば、PHPマニュアルには以下のコードがある。
<?php
$obj = (object) array('1' => 'foo');
var_dump(isset($obj->{'1'})); // PHP 7.2.0 以降は 'bool(true)' それより前は 'bool(false)'
var_dump(key($obj)); // PHP 7.2.0 以降は 'string(1) "1"' それより前は 'int(1)'
?>
これを実行してやると、出力はこうなる。
(配列とオブジェクトの違いがいまいちはっきりしてない…。
オブジェクト指向についても理解が甘いようだ…。ここは各自調べたい)
んで、ここで以下の1のようにオブジェクトに対して配列でなんかしようとしたら出たエラーが冒頭のエラー。2のように変えてやればOK。
var_dump($obj[1]); //1
var_dump($obj->{1});//2
いまだにはっきりとオブジェクト指向説明できない…。
参照
CF、型の相互変換(2021/2/17 最終閲覧)