概要
PHPの名前空間(namespace)は、Javaのパッケージのようにコード群をカプセル化し、異なる名前空間の間での名前の衝突を避ける役割を持つ。
namespace 名前空間名;
namespace
が記述された以降のコードはその名前空間に属する- 同じ名前空間内では、クラス名などはそのまま記述
- 異なる名前空間のクラスなどを用いるときは、絶対パスを使うか
use
文で名前空間を指定する(このuse
文はトレイトのuse
とは異なる)
クラスの例
以下の例は、異なる名前空間のクラスを利用する場合。
- 名前空間
B
でクラス名MyClass
だけを記述すると、名前空間B
のMyClass
が使われる - 絶対パス
\A\MyClass
と記述すると、名前空間A
のMyClass
が使われる use \A\MyClass
を記述すると、MyClass
と記述したときに名前空間A
のMyClass
が使われる(as ...
でエイリアスも指定できる)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
namespace A; class MyClass { public function show() { echo "名前空間Aのクラス\n"; } } namespace B; class MyClass { public function show() { echo "名前空間Bのクラス\n"; } } $obj = new MyClass(); $obj->show(); $obj = new \A\MyClass(); $obj->show(); namespace C; use \A\MyClass; // use A\MyClassでもよい $obj = new MyClass(); $obj->show(); // 名前空間Bのクラス // 名前空間Aのクラス // 名前空間Aのクラス |
関数の場合
以下の例は、異なる名前空間の関数を利用する場合。
- 名前空間
B
で関数名func
だけを記述すると、名前空間B
のfunc
が使われる - 絶対パス
\A\func
と記述すると、名前空間A
のfunc
が使われる use function \A\func
を記述すると、func
と記述したときに名前空間A
のfunc
が使われる(as ...
でエイリアスも指定できる)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
namespace A; function func() { echo "名前空間Aの関数\n"; } namespace B; function func() { echo "名前空間Bの関数\n"; } func(); \A\func(); namespace C; use function \A\func; func(); // 名前空間Bの関数 // 名前空間Aの関数 // 名前空間Aの関数 |
定数の場合
以下の例は、異なる名前空間の定数を利用する場合。
- 名前空間
B
で関数名CONSTANT
だけを記述すると、名前空間B
のCONSTANT
が使われる - 絶対パス
\A\CONSTANT
と記述すると、名前空間A
のCONSTANT
が使われる use const \A\CONSTANT
を記述すると、CONSTANT
と記述したときに名前空間A
のCONSTANT
が使われる(as ...
でエイリアスも指定できる)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
namespace A; const CONSTANT = '名前空間Aの定数'; namespace B; const CONSTANT = '名前空間Bの定数'; echo CONSTANT . "\n"; echo \A\CONSTANT . "\n"; namespace C; use const \A\CONSTANT; echo CONSTANT . "\n"; // 名前空間Bの定数 // 名前空間Aの定数 // 名前空間Aの定数 |
変数は名前空間によらずグローバル
変数は、それが定義された名前空間によらずグローバルスコープになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
namespace A; $var = '変数は名前空間によらずグローバル'; echo $var . "\n"; namespace B; echo $var . "\n"; namespace C; echo $var . "\n"; // 変数はグローバル // 変数はグローバル // 変数はグローバル |
外部ファイルに分ける場合
外部ファイルで名前空間を設定している場合、インクルードしたコードで明示的に名前空間を指定する。
以下の例では2つのPHPファイルを準備し、それぞれの名前空間を設定している。
namespace_a.php
1 2 3 4 5 6 7 8 9 |
<?php namespace A; class MyClass { public function show() { echo "名前空間AのMyClass\n"; } } |
namespace_b.php
1 2 3 4 5 6 7 8 9 |
<?php namespace B; class MyClass { public function show() { echo "名前空間BのMyClass\n"; } } |
そして別のファイルでこれらのファイルを読み込んで実行する。
インクルード後に名前空間なしでクラス名のみ指定すると、クラスが見つからずエラーになる。
1 2 3 4 5 6 7 8 |
<?php require 'namespace_a.php'; require 'namespace_b.php'; $obj = MyClass(); // Error: Class 'MyClass' not found in ... |
絶対パスかuse
を使えば名前空間に応じたクラスを指定できる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php require 'namespace_a.php'; require 'namespace_b.php'; $obj = new \A\MyClass(); $obj->show(); // 名前空間AのMyClass use \B\MyClass; $obj = new MyClass(); $obj->show(); // 名前空間BのMyClass |
名前空間の部分指定
名前空間をパスで設定した場合、useでその一部を指定することができる。
以下の例では、
- 名前空間
japan\aichi
の中でMyClassA
とMyClassB
を定義 - 名前空間
japan\osaka
の中でMyClass
を定義 use japan\aichi
とすることで、japan\aichi
→aichi
として使えるようになるjapan\aichi\MyClassA
→aichi\MyClassA
japan\aichi\MyClassB
→aichi\MyClassB
use japan\osaka
とすることで、japan\osaka
→osaka
として使えるようになるjapan\osaka\MyClass
→osaka\MyClass
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<?php namespace japan\aichi; class MyClassA { public function show() { echo "名前空間\japan\aichiのMyClassA\n"; } } class MyClassB { public function show() { echo "名前空間\japan\aichiのMyClassB\n"; } } namespace japan\osaka; class MyClass { public function show() { echo "名前空間\japan\osakaのMyClass\n"; } } // 名前空間の一部をuseし、japan\aichiをaichiとして使えるようにする use japan\aichi; $obj = new aichi\MyClassA(); $obj->show(); $obj = new aichi\MyClassB(); $obj->show(); // 名前空間\japan\aichiのMyClassA // 名前空間\japan\aichiのMyClassB // 名前空間の一部をuseし、japan\osakaをosakaとして使えるようにする use japan\osaka; $obj =new osaka\MyClass(); $obj->show(); // 名前空間\japan\osakaのMyClass |