Contents
使い勝手のいいstdClassとは
stdClass は PHP に標準で定義されている「汎用的に使える空のクラス」です。あえて自分でクラスファイルを作る必要はなく、(object) キャストなどをするだけで自動的に stdClass のインスタンスが生成されます。
stdClassがよく使用されるケース
スカラー値や配列を一時的にオブジェクトとしてまとめたいとき
- たとえばデータを JSON で受け取った際、それをオブジェクト形式でアクセスしたい場合に json_decode() の結果を stdClass にする(第 2 引数に false を指定)など。
- 配列をわざわざクラスにマッピングするほどではないが、「プロパティとしてアクセスしたほうが都合がいい」ような時。
メタプログラミングやダイナミックにプロパティを変更したいとき
通常のクラスだと事前にプロパティを設計しておく必要がありますが、stdClass なら「$obj->hoge = ‘value’」のように後からプロパティを追加できます。
一般的な開発でそこまで多用されません。
- データをまとめるなら配列やカスタムクラスのほうが意図が分かりやすい
- IDE 補完や設計面で、きちんと型を持ったクラスのほうが保守性が高い
- stdClass はあくまで「何もない空の器」であり、リーダビリティ・可読性が落ちる場合がある
(object) でキャストすると stdClass に変換される仕組みと一般的な使い方
PHP で (object)
演算子を使うことで、スカラー値(文字列や数値など)や配列を stdClass
オブジェクトへ強制的に変換することができます。この方法は、特定の場面で「配列などをまとめてオブジェクトとして扱いたい」といったケースに活用されます。
(object) キャストとは?
「キャスト演算子」とは、変数やリテラルを別の型へ強制的に変換するための文法です。PHP では以下のように使われます。
$integerValue = (int)$someValue; // 整数型へキャスト
$stringValue = (string)$someValue; // 文字列型へキャスト
$arrayValue = (array)$someValue; // 配列型へキャスト
$objectValue = (object)$someValue; // オブジェクト(stdClass)型へキャスト
このうち (object)
を使うと、PHP は内部で新たに stdClass
インスタンスを生成します。
スカラー値を (object) でキャストした場合
文字列や数値などのスカラー値を (object)
でキャストすると、以下のように stdClass
インスタンスが生成されます。スカラー値は scalar
というプロパティに格納されます。
$value = (object) 'Hello';
var_dump($value);
/* object(stdClass)#1 (1) {
["scalar"]=> string(5) "Hello" } */
このように、キャスト後のオブジェクトは $value->scalar
として元の文字列を参照できます。
配列を (object) でキャストした場合
一方、配列を (object)
キャストすると、配列のキーがそのままプロパティ名となり、stdClass
インスタンスが生成されます。
$array = ['foo' => 'bar', 'baz' => 123]; $obj = (object) $array; var_dump($obj); /* object(stdClass)#1 (2) { ["foo"]=> string(3) "bar" ["baz"]=> int(123) } */
(object) キャストの一般的な使用方法
- スカラー値や配列を一時的にオブジェクトとして扱いたい場合に使用
- 動的にプロパティを追加したり、配列のようなデータをあえてオブジェクト形式で操作したいケース
- メタプログラミングや汎用的なデータオブジェクトを取り扱うとき
一方で、ほとんどの場面では配列のまま扱った方がシンプルなことも多く、実務で (object)
キャストが頻繁に登場するわけではありません。自作のクラスを定義して、明示的にプロパティを設計する方が可読性・保守性ともに高くなることが多いです。
まとめ
(object)
演算子は、スカラー値や配列を stdClass
オブジェクトとして扱うためのキャスト手段です。文字列をキャストすれば scalar
プロパティ付きの stdClass
が得られ、配列をキャストすれば配列のキーをプロパティ名とする stdClass
が得られます。 実際には用途が限られますが、メタプログラミングやユニークな場面で重宝することがあります。 普段の開発では必要性や可読性を考慮しつつ、適切に活用してみてください。