Edited at

名前空間について

More than 1 year has passed since last update.

名前空間とはクラスや関数の使える名前の集合を限定し、関数名やクラス名の衝突を防いだり、機能の参照をわかりやすくするための機能。


名前空間を利用するときのポイント。

名前空間の区切りにはバックスラッシュ(\)を使う

名前空間を定義した場合、グローバルな関数やクラスには先頭にバックスラッシュを付け、グローバルな名前空間から参照しなければならない

名前空間における言葉の定義

・非修飾名...名前空間区切りを含まない識別子

・修飾名...名前空間区切りを含む識別子

・完全修飾名...名前空間区切りから始まる識別子


名前空間の定義

<?php

namespace 名前空間;
namespace 名前空間\サブ名前空間;

名前空間の影響受けるのは

・クラス

・関数

・定数

<?php

namespace Project/Module;
class Directory{} //Project/Moduleクラス
function file () {} //Project/Module関数

別の名前空間から参照される場合は、完全修飾名を指定する。

<?php

namespace Other;
require_once 'Project\Module\Directory.php';
$dir1 = new \Project\Module\Directory()


1つのファイルに複数の名前空間を定義する

1つ目はnamespace宣言を複数する方法。

<?php

namespace Project\Module;
namespace Profect\Module1;

2つ目は{}で囲う方法。

<?php

namespace Project\Module{

}
namespace Project\Module1{

}


インポートルール

<?php

use \クラス名;
use 名前空間;
use 名前空間 as 別名;
use 名前空間\クラス名;


名前解決

名前空間の影響を受ける、クラス、関数、定数の定義が読み込まれそれが実際に呼び出されるまでには、コンパイル時の変換と、実行時の名前解決という2つのフェーズがある。

コンパイル時には、useキーワードによってインポートされた名前空間やクラス名でスクリプト内で使われているクラスや定数を変換する。


動的な名前空間の利用

可変変数や可変関数や動的なクラス名など、変数に文字列を代入して動的に利用できたように、名前空間でも同じように動的な名前空間の利用ができる。

文字列の定義にダブルクォートを用いると、\はエスケープ文字とみなされてしまうため、\\とする必要がある。

シングルクォートで囲う場合で末尾に名前空間区切りが来る場合、末尾のシングルクォートのエスケープと判断されないために\\とする必要がある。