使い勝手のいいstdClassとは
stdClass は PHP に標準で定義されている「汎用的に使える空のクラス」です。あえて自分でクラスファイルを作る必要はなく、(object) キャストなどをするだけで自動的に stdClass のインスタンスが生成されます。
stdClassがよく使用されるケース
スカラー値や配列を一時的にオブジェクトとしてまとめたいとき
- たとえばデータを JSON で受け取った際、それをオブジェクト形式でアクセスしたい場合に json_decode() の結果を stdClass にする(第 2 引数に false を指定)など。
- 配列をわざわざクラスにマッピングするほどではないが、「プロパティとしてアクセスしたほうが都合がいい」ような時。
メタプログラミングやダイナミックにプロパティを変更したいとき
通常のクラスだと事前にプロパティを設計しておく必要がありますが、stdClass なら「$obj->hoge = ‘value’」のように後からプロパティを追加できます。
一般的な開発でそこまで多用されません。
- データをまとめるなら配列やカスタムクラスのほうが意図が分かりやすい
- IDE 補完や設計面で、きちんと型を持ったクラスのほうが保守性が高い
- stdClass はあくまで「何もない空の器」であり、リーダビリティ・可読性が落ちる場合がある
stdClassと無名クラスの使い分け
PHP7.0で追加された無名クラスも、stdClassと同様にオブジェクトを作成することもあり、まぎらわしいですが、それぞれの用途や特徴は異なります!
プロパティの定義方法が異なります。
stdClass は 動的にプロパティを追加 できるが、無名クラスは事前にプロパティを定義しなければならない。
$std = new stdClass();
$std->name = "Taro"; // OK
$anon = new class {};
$anon->name = "Taro"; // エラー(未定義プロパティへのアクセス)
特徴 | stdClass | 無名クラス |
---|---|---|
PHPバージョン | すべてのバージョン | PHP 7 以降 |
メソッド定義 | できない | できる |
コンストラクタ | なし | あり |
用途 | データの簡易的な保持 | 一時的なクラスの作成 |
インスタンス化 | new stdClass() | new class {} |
(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)
キャストが頻繁に登場するわけではありません。自作のクラスを定義して、明示的にプロパティを設計する方が可読性・保守性ともに高くなることが多いです。