Developer

【PHP応用】名前空間とは
2021.07.31
Lv1

【PHP応用】名前空間とは

名前空間

今回は名前空間(namespace)について紹介します。


■名前空間とは

・名前空間とは、クラス名の重複を防ぐためのグループ分けのようなもの。
・同じファイル名は同じディレクトリに作成できないのと同じように、同じ名前空間内で同じクラスは作成できない。
・これにより、別システム/機能で同じクラス名を使いたい時に、名前空間を分けておくことで別物として扱うことができる。



■名前空間のルール

・名前空間の影響を受けるのはクラス、インターフェイス、関数、定数
・名前空間を含むファイルでは、ファイルの先頭で名前空間を宣言しなければならない (declareのみ可)。
・名前空間を指定しない場合、定義されたクラスや関数はグローバル空間に属することになる
・ディレクトリやファイルと同様、PHP の名前空間においても名前空間の階層構造を指定することができる。
・複数の名前空間をひとつのファイルに記述することもできるが、基本的に避けること。


● クラスやメソッドの参照方法

名前空間を使用しない場合、「$a = new ClassX();」という形でクラスにアクセスができたが、
名前空間を使用する場合にクラス名を参照するには、次の 3 つの方法でアクセスすることとなる。

1.非修飾
$a = new ClassX();
ClassX::methodX();

※今までの参照方法と同じ。
この場合、名前空間内にその関数や定数がなければ グローバルな関数あるいは変数とみなされる。

2.修飾名
$a = new 指定名前空間\ClassX();
指定名前空間\ClassX::methodX();

※相対パス指定のような指定の仕方。
この記述が名前空間に属している場合は、「現在の名前空間\指定名前空間\ClassX」と解釈される。
この記述が名前空間に属さないグローバル空間における記述の場合、「指定名前空間\ClassX」 と解釈される。

3.完全修飾名
$a = new \名前空間\ClassX();
\名前空間\ClassX::methodX();

※絶対パス指定のような指定の仕方。常に「名前空間\ClassX」 と解釈される。
なお、グローバルなクラス、関数、定数にアクセスするには、完全修飾名を使用しなければならない。


■useキーワード

名前空間内から、グローバルスコープや自空間よりも上位や並列にある名前空間のクラスや関数にアクセスする際には、完全修飾(「\」から始まる指定)をしなければならない。
処理を記述するにあたり、これでは面倒くさいので、「use」を処理先頭に記述することで、以降の記述で修飾を省くことができる

useの指定構文
名前空間“A”での指定を考える。

namespace A;
use \B;            // グローバルスコープのBクラスを“B”と記述して使えるようになる。
use \C\D;        // グローバルスコープの名前空間”C”内のクラス“D”を”D”と記述して使えるようになる。
use B;              // 名前空間Aの”B”クラスを”B”とするが、Bが定義済みの場合はそもそも不要なので定義不可
use C\D;          // 名前空間A\CのDクラスを”D”と記述して使えるようになる。
use C\E as F;    // 名前空間A\CのEクラスを”F”と記述して使えるようになる。


上記で紹介したように
名前空間を使用することでクラス名やメソッド名の衝突を避けることができます。
今回で名前空間の紹介は以上です。