##名前空間とは
名前空間は、クラスや関数の 所属
のようなもの。
例えば同じ会社に田中太郎さんが3人いたとします(奇跡的に)
この場合、社内で「田中太郎さーん」と呼んでも、どの田中太郎さんを呼んでいるのかわかりません。
ところが
「システム開発部の田中太郎さーん」
「企画部の田中太郎さーん」
「営業部の田中太郎さーん」
と呼んでやれば、どの田中太郎さんか区別できます。
どこに所属している〜〜さん。のようなくくりで表現するのが名前空間です。
会社の例をプログラムに置き換えて考えてみます。
名前空間を使用することのメリットは、PHPマニュアルに記載されている下記のような問題を解決することです。
https://www.php.net/manual/ja/language.namespaces.rationale.php
- あなたが作成したコードと PHP の組み込みのクラス/関数/定数 あるいはサードパーティのクラス/関数/定数の名前が衝突する
- 最初の問題を解決するためには、Extra_Long_Names のような長い名前をつけなければならない
名前空間を定義するには namespace 名前空間名
のように指定します。
<?php
namespace App\Sample
class MyClass {
}
このようにファイルの先頭で名前空間を定義します。
\で階層を区切り、名前空間の階層はプロジェクトのフォルダの構造に合わせます。
構文規則ではないですが分かりやすいですし、オートロードでも利用できるのでフォルダー構造に従って定義するというルールを決めておいた方が良いかもしれません。
(オートロードについてはこちらを参考にしてみてください)
##名前空間の定義
名前空間には、非修飾名、修飾名、完全修飾名という記法があります。
https://www.php.net/manual/ja/language.namespaces.rules.php
・非修飾名は名前空間を含まない名前のことで、グローバル名前空間に属します。
名前空間を使用しない状態(通常時)での指定の仕方です。
MyClass
・修飾名は現在の名前空間を基点として\で区切ります。相対パスのようなものです。
Sample\MyClass
・完全修飾名は\で始まる名前空間のことです。絶対パスのようなものです。
\App\Sample\MyClass
あるクラスの名前空間の中からグローバル名前空間のクラスを使用したい場合
new \SplFileInfo
や throw new \RuntimeException
のように先頭に \ をつけて完全修飾名で指定する必要があります。
##名前空間の利用
名前空間を利用すると、クラスを呼び出す時には「Sample\Hoge\Myclass」のように指定しなければいけません。
このように長い名前を呼び出す度に毎回記述するのは面倒なのでuse命令でインポートします。
useでインポートした後は本来のクラス名だけでクラスを使用できます。
<?php
require_once './sample/MyClass.php';
use App\Sample\MyClass;
$class = new MyClass();
また、名前空間を分けていても名前が衝突してしまうような場合はasで別名をつけます
<?php
require_once './hoge/MyClass.php';
require_once './foo/Myclass.php';
use App\Hoge\MyClass as HogeClass;
use App\Foo\MyClass as FooClass;
$classHoge = new HogeClass();
$classFoo = new FooClass();
このように名前空間を定義することで、PHPの組み込みクラスやサードパーティのクラスとの名前の衝突を回避することができ、composerを利用したオートロードなども実装しやすくなります。
###まとめ
名前空間を簡単に一言でまとめると
**「名前が被らないように、フォルダー構造に従って名前をつけて、一意な修飾名として使えるようにする機能のこと」**でしょうか。