PHP – 名前空間~namespace

概要

PHPの名前空間(namespace)は、Javaのパッケージのようにコード群をカプセル化し、異なる名前空間の間での名前の衝突を避ける役割を持つ。

namespace 名前空間名;

  • namespaceが記述された以降のコードはその名前空間に属する
  • 同じ名前空間内では、クラス名などはそのまま記述
  • 異なる名前空間のクラスなどを用いるときは、絶対パスを使うかuse文で名前空間を指定する(このuse文はトレイトuseとは異なる)

クラスの例

以下の例は、異なる名前空間のクラスを利用する場合。

  • 名前空間Bでクラス名MyClassだけを記述すると、名前空間BMyClassが使われる
  • 絶対パス\A\MyClassと記述すると、名前空間AMyClassが使われる
  • use \A\MyClassを記述すると、MyClassと記述したときに名前空間AMyClassが使われる(as ...でエイリアスも指定できる)

関数の場合

以下の例は、異なる名前空間の関数を利用する場合。

  • 名前空間Bで関数名funcだけを記述すると、名前空間Bfuncが使われる
  • 絶対パス\A\funcと記述すると、名前空間Afuncが使われる
  • use function \A\funcを記述すると、funcと記述したときに名前空間Afuncが使われる(as ...でエイリアスも指定できる)

定数の場合

以下の例は、異なる名前空間の定数を利用する場合。

  • 名前空間Bで関数名CONSTANTだけを記述すると、名前空間BCONSTANTが使われる
  • 絶対パス\A\CONSTANTと記述すると、名前空間ACONSTANTが使われる
  • use const \A\CONSTANTを記述すると、CONSTANTと記述したときに名前空間ACONSTANTが使われる(as ...でエイリアスも指定できる)

変数は名前空間によらずグローバル

変数は、それが定義された名前空間によらずグローバルスコープになる。

外部ファイルに分ける場合

外部ファイルで名前空間を設定している場合、インクルードしたコードで明示的に名前空間を指定する。

以下の例では2つのPHPファイルを準備し、それぞれの名前空間を設定している。

namespace_a.php

namespace_b.php

そして別のファイルでこれらのファイルを読み込んで実行する。

インクルード後に名前空間なしでクラス名のみ指定すると、クラスが見つからずエラーになる。

絶対パスかuseを使えば名前空間に応じたクラスを指定できる。

名前空間の部分指定

名前空間をパスで設定した場合、useでその一部を指定することができる。

以下の例では、

  • 名前空間japan\aichiの中でMyClassAMyClassBを定義
  • 名前空間japan\osakaの中でMyClassを定義
  • use japan\aichiとすることで、japan\aichiaichiとして使えるようになる
    • japan\aichi\MyClassAaichi\MyClassA
    • japan\aichi\MyClassBaichi\MyClassB
  • use japan\osakaとすることで、japan\osakaosakaとして使えるようになる
    • japan\osaka\MyClassosaka\MyClass

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です