《PHP8上級試験対策》名前空間と組み込みクラスの扱い — stdClass()がエラーになる理由

  • URLをコピーしました!

はじめに

PHPの名前空間を使っているときに、うっかり「組み込みクラス」を関数のように呼び出してしまうと、致命的エラー(Fatal error) に遭遇することがあります。本記事では、stdClass() を例に、「なぜエラーになるのか」「正しい呼び方はどうするのか」をわかりやすく図解します。

キーワード: 名前空間 / グローバル空間 / use句 / 完全修飾名 / stdClass / Fatal error

目次

問題コード例

<?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();✅ OKuseでグローバルクラスを指定

🧭 まとめフレーズ

名前空間の中では、PHPは「Exam\〇〇」というスコープを前提に探索します。
組み込みクラスや関数を使う場合は、「\」でグローバル空間を明示するのを忘れずに!

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次