PHP - namespace(名前空間)
公開日:2020-12-22 更新日:2020-12-22
[PHP]
1. 概要
namespace(名前空間)についてです。
大規模なプロジェクトになると、1度に複数のPHPファイルを読み込むため、
クラス名や関数名が重複する可能性があります。
そこで、クラス名や関数名の他に、namespace(名前空間)と言う名前を付けることで、重複を防ぐことができます。
考え方としては、住所の都道府県、市区町村などと同じです。
定義方法
大規模なプロジェクトになると、1度に複数のPHPファイルを読み込むため、
クラス名や関数名が重複する可能性があります。
そこで、クラス名や関数名の他に、namespace(名前空間)と言う名前を付けることで、重複を防ぐことができます。
考え方としては、住所の都道府県、市区町村などと同じです。
定義方法
namespace 名前空間1\名前空間2\名前空間3;
クラス
関数
定数
ブロックで指定することもできます。namespace 名前空間1\名前空間2\名前空間3 {
クラス
関数
定数
}
2. 使用例
namespace 内に定義されたクラスを、他の namespace 内で使用する場合は、
namespace を付けたフルクラス名で指定するか、use で指定する必要があります。
namespace 内では、namespace が指定されていない既存のクラス名の前に「\」を付ける必要があります。
付けない場合は、同じ namespace のクラスを探しに行くため、エラーとなります。
namespace を付けたフルクラス名で指定するか、use で指定する必要があります。
namespace tokyo\ikebukuro;
class Test {
public function printName() {
print("Ikebukuro\n");
}
}
namespace tokyo\shibuya;
class Test {
public function printName() {
print("Shibuya\n");
}
}
namespace tokyo\minato;
$obj1 = new \tokyo\ikebukuro\Test();
$obj1->printName(); // Ikebukuro
$obj2 = new \tokyo\shibuya\Test();
$obj2->printName(); // Shibuya
// use を使うと、名前空間を省略できる
use \tokyo\ikebukuro\Test;
use \tokyo\shibuya\Test as ShibuyaTest;
$obj3 = new Test();
$obj3->printName(); // Ikebukuro
$obj4 = new ShibuyaTest();
$obj4->printName(); // Shibuya
実行結果Ikebukuro
Shibuya
Ikebukuro
Shibuya
namespace 内では、namespace が指定されていない既存のクラス名の前に「\」を付ける必要があります。
付けない場合は、同じ namespace のクラスを探しに行くため、エラーとなります。
namespace tokyo\chiyoda;
//$d = new DateTime(); // tokyo\chiyoda\DateTime を探しに行ってエラーになる
$d = new \DateTime(); // 前に「\」を付ける
var_dump($d);
実行結果object(DateTime)#1 (3) {
["date"]=>
string(26) "2020-12-02 13:39:18.026128"
["timezone_type"]=>
int(3)
["timezone"]=>
string(3) "UTC"
}