導入
PHPでの開発において、外部から受け取ったデータや、動的に生成された変数が「期待通りのオブジェクトであるか」を確認することは、堅牢なアプリケーションを作るための基本です。予期せぬ型がメソッドやプロパティにアクセスしようとすると、PHPは致命的なエラー(Fatal Error)を発生させ、処理を停止させてしまいます。is_object関数は、変数がオブジェクト型であるかを安全に判定することで、こうした実行時エラーを未然に防ぐ重要な役割を担っています。
基礎知識
PHPのis_objectは、引数として渡された変数がオブジェクト型であればtrueを、それ以外(文字列、数値、配列、nullなど)であればfalseを返す組み込み関数です。
PHP 7.2.0以降では、定義済みのクラスが存在しない状態でシリアライズされたデータから復元された「__PHP_Incomplete_Class」型のオブジェクトに対してもtrueを返すよう仕様が変更されました。これは、セッションデータやシリアライズされたデータを扱う際に、型の不一致でクラッシュするのを防ぐための重要な挙動です。
実装/解決策
実務における実装では、単にオブジェクトかどうかを調べるだけでなく、そのオブジェクトが「特定のプロパティやメソッドを持っているか」を判断する前処理としてis_objectを使用します。特に、APIレスポンスの解析や、DI(依存性の注入)コンテナから取得したインスタンスを扱う際、型チェックを怠ると「Attempt to read property on null」といったエラーが発生しやすいため、ガード句として活用するのがベストプラクティスです。
サンプルプログラム
/
function getUserName($user): string
{
// ガード句としてis_objectを使用
// オブジェクトでない場合は例外を投げるか、安全なデフォルト値を返す
if (!is_object($user)) {
return ‘ゲストユーザー’;
}
// オブジェクトであることが保証されているため、安心してプロパティにアクセス可能
// ただし、プロパティの存在確認にはproperty_existsを併用するのがより安全
return $user->name ?? ‘名前未設定’;
}
// テスト用:stdClassを使ってオブジェクトを生成
$userObj = new stdClass();
$userObj->name = ‘田中太郎’;
echo getUserName($userObj); // 出力: 田中太郎
echo PHP_EOL;
echo getUserName(null); // 出力: ゲストユーザー
?>
応用・注意点
現場で役立つ注意点をいくつか挙げます。
1. is_a()との使い分け: 特定のクラスのインスタンスであるかを確認したい場合は、is_objectではなくis_a()を使用してください。is_objectは「オブジェクトであれば何でもOK」という判定ですが、is_a()は継承関係やインターフェースの実装まで含めた厳密な型チェックが可能です。
2. nullの扱い: is_object(null)は確実にfalseを返します。データベースからの取得結果がnullになる可能性がある場合は、必ずis_objectでチェックしてからプロパティへアクセスする癖をつけましょう。
3. 型ヒントの活用: 最近のPHPであれば、関数の引数に型ヒント(object型など)を指定できるため、そもそも関数内でis_objectを使う必要がない設計を目指すのが理想的です。しかし、外部連携など型が不明確なデータを受け取る境界線では、依然としてis_objectによるバリデーションが最も信頼できる防波堤となります。