はじめに
PHPの名前空間を使っているときに、うっかり「組み込みクラス」を関数のように呼び出してしまうと、致命的エラー(Fatal error) に遭遇することがあります。本記事では、stdClass()
を例に、「なぜエラーになるのか」「正しい呼び方はどうするのか」をわかりやすく図解します。
目次
問題コード例
<?php
declare(strict_types=1);
namespace Exam;
error_reporting(-1);
$obj = stdClass(); // ← これでエラー!
💥 実行結果
Fatal error: Uncaught Error: Call to undefined function Exam\stdClass()
🧠 理解のポイント
◆ 1. 名前空間を定義すると、PHPはこう考える
namespace Exam;
$obj = stdClass();
PHPは上記を次のように解釈します👇
Exam\stdClass() という関数を呼び出そうとしている
でも stdClass()
は関数ではなく、クラス名 です。しかも、PHPの組み込みクラスはすべてグローバル空間に存在します。だから「Exam\stdClass() なんて関数は存在しない」と怒られるのです。
🧩 ASCIIアート図解
┌──────────────────────────────┐
│ グローバル空間(default) │
│ │
│ ├─ stdClass │
│ ├─ Exception │
│ ├─ strlen() │
│ └─ count() │
└──────────────────────────────┘
▲
│ ← PHPの組み込みクラス/関数はここ
│
┌──────────────────────────────┐
│ namespace Exam; │
│ │
│ $obj = stdClass(); ← ❌ Exam\stdClass() 関数を探す │
│ $obj = new \stdClass(); ← ✅ グローバルを明示 │
└──────────────────────────────┘
✅ 正しい書き方
方法①:完全修飾名を使う
$obj = new \stdClass();
方法②:use句でグローバルクラスを指定
namespace Exam;
use stdClass;
$obj = new stdClass();
どちらも、グローバル空間にある組み込みクラスを明示的に参照している点がポイントです。
🚀 まとめ
書き方 | 結果 | 理由 |
---|---|---|
$obj = stdClass(); | ❌ エラー | 関数呼び出しと解釈される |
$obj = new stdClass(); | ✅ OK(同名クラスがExam内にあれば) | |
$obj = new \stdClass(); | ✅ OK | グローバル空間を明示 |
use stdClass; $obj = new stdClass(); | ✅ OK | useでグローバルクラスを指定 |
🧭 まとめフレーズ
名前空間の中では、PHPは「Exam\〇〇」というスコープを前提に探索します。
組み込みクラスや関数を使う場合は、「\」でグローバル空間を明示するのを忘れずに!