PHP - namespace(名前空間)

公開日:2020-12-22 更新日:2020-12-22
[PHP]

1. 概要

namespace名前空間)についてです。

大規模なプロジェクトになると、1度に複数のPHPファイルを読み込むため、
クラス名や関数名が重複する可能性があります。
そこで、クラス名や関数名の他に、namespace(名前空間)と言う名前を付けることで、重複を防ぐことができます。
考え方としては、住所の都道府県、市区町村などと同じです。

定義方法
namespace 名前空間1\名前空間2\名前空間3;

クラス
関数
定数
ブロックで指定することもできます。
namespace 名前空間1\名前空間2\名前空間3 {
  クラス
  関数
  定数
}

2. 使用例

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"
}