はじめに
PHPの名前空間では、異なるスコープに存在するクラスを区別するために namespace を利用します。しかし、長い名前空間を毎回書くのは面倒ですよね。そこで登場するのが use 演算子(エイリアス宣言)です。
この記事では、PHP8上級試験でも頻出の use の仕組みを、図解でわかりやすく整理します。
目次
🧩 問題コード
<?php
declare(strict_types=1);
namespace Exam{
class Hoge{
}
}
namespace ExamTest{
use Exam\Hoge as Foo;
\error_reporting(-1);
$obj = new Foo();
var_dump($obj);
}💡 実行結果
object(Exam\Hoge)#1 (0) {
}🔍 解説ステップ
① 名前空間の定義
まず、次の2つの名前空間が存在しています:
Exam → Hoge クラスを定義
ExamTest → use宣言で Hoge に別名 Foo を付ける② use の役割
use Exam\Hoge as Foo;これは、「Exam\Hoge クラスを Foo という別名で呼び出せるようにする」宣言です。
つまり「インポート」ではなく「別名宣言」。
③ new Foo() の意味ExamTest 内で new Foo() と書いても、実際には以下と同じ意味になります。
$obj = new Exam\Hoge();なぜなら、Foo は Exam\Hoge のエイリアスだからです。
🎨 ASCIIアートで理解する:名前空間とエイリアスの関係
+----------------------------+
| namespace Exam |
| └── class Hoge |
+----------------------------+
│
│ use Exam\Hoge as Foo
▼
+----------------------------+
| namespace ExamTest |
| └── Foo → Exam\Hoge |
| $obj = new Foo(); |
| // 実際は Exam\Hoge |
+----------------------------+
=> 出力: object(Exam\Hoge)#1 (0) { }この図のように、use は「矢印でつながる別名宣言」だと覚えるとイメージしやすいです。
⚙️ use は「インポート」ではない!
重要な点ですが、use はファイルを読み込む構文ではありません。
すでに読み込まれているクラスを「このスコープでこう呼ぶ」と宣言しているだけです。
つまり:
- ✅ 動作時のクラスは変わらない
- ✅ 別名(ショートカット)をつけるだけ
- 🚫
requireやincludeとはまったく別物
まとめ
| 項目 | 内容 |
|---|---|
| 宣言 | use Exam\Hoge as Foo; |
| 意味 | Exam\Hoge に別名 Foo を付ける |
| 実際の動作 | $obj = new Exam\Hoge(); と同じ |
| 出力結果 | object(Exam\Hoge)#1 (0) { } |
| 試験ポイント | use は「読み込み」ではなく「別名宣言」 |
📝 暗記フレーズ
「use は import ではなく alias」
「new Foo() は new Exam\Hoge() に展開される」
