はじめに
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()
に展開される」