PHP 名前空間
1. PHP 名前空間(Namespaces)とは?
PHPの名前空間(Namespaces)は、クラス、インターフェース、関数、定数の間での名前の衝突(Naming Conflicts)を防ぐために使用されます。
プロジェクトの規模が大きくなったり、複数のソースからコードを利用したりする場合に、関連するコードを一つの名前の下にグループ化することで、名前の競合を避けることができます。
1.1 なぜ名前空間を使用するのか?
- 特に大規模なプロジェクトにおいて、名前の衝突を避けるため
- コードを論理的なグループに整理するため
- 自分のコードとライブラリのコードを分離するため
- 衝突を起こさずに、同じ名前を複数のクラスに使用できるようにするため
例えば、HTMLのテーブルを記述する一連のクラス(Table、Row、Cell)があるとします。同時に、家具を記述する別の一連のクラス(Table、Chair、Bed)もあるとします。ここで名前空間を使用すれば、これら2つのグループにクラスを整理でき、2つの Table クラスが混同されるのを防ぐことができます。
2. 名前空間の宣言
名前空間は、PHPファイルの冒頭で namespace キーワードに続けて名前を指定して宣言する必要があります。
以下は、Html という名前空間を宣言する例です。
<?php
namespace Html;
?>注意: 名前空間の宣言は、PHPファイルの一番最初に記述しなければなりません。以下のコードは無効です。
<?php
echo "Hello World!";
namespace Html; // ここで宣言するのはNG
...
?>このPHPファイル内で宣言されたすべてのクラス、インターフェース、関数、定数は、Html 名前空間に属することになります。
2.1 実装例:Html名前空間内でのクラス作成
<?php
namespace Html;
class Table {
public $title = "";
public $rows = 0;
public function info() {
echo "<p>{$this->title} は {$this->rows} 行あります。</p>";
}
}
// 完全修飾名(Fully Qualified Name)を使用してインスタンス化
$table = new \Html\Table();
$table->title = "マイ・テーブル";
$table->rows = 5;
?>
<!DOCTYPE html>
<html>
<body>
<?php
$table->info();
?>
</body>
</html>さらに細かく整理するために、名前空間をネスト(入れ子)にすることも可能です。
2.2 ネストされた名前空間の構文
Code 名前空間の中に Html 名前空間を宣言する場合:
<?php
namespace Code\Html;
?>3. 名前空間の使用方法
名前空間の宣言に続くコードはその名前空間内で動作しているため、同じ名前空間に属するクラスは修飾子なしでインスタンス化できます。名前空間の外からクラスにアクセスする場合は、クラス名に名前空間を付与する必要があります。
3.1 外部から名前空間内のクラスを使用する例
<?php
// 名前空間を指定してクラスを使用
$table = new Html\Table();
$row = new Html\Row();
?>同じ名前空間から多くのクラスを同時に使用する場合は、ファイル冒頭で namespace を宣言しておくと簡単です。
3.2 名前空間を宣言して修飾子を省略する例
<?php
namespace Html;
// Html\ という修飾子なしでTableクラスを使用可能
$table = new Table();
$row = new Row();
?>4. 名前空間のエイリアス(別名)
名前空間やクラスにエイリアス(Alias:別名)を付けると、コードが書きやすくなります。これには use キーワードを使用します。
4.1 名前空間にエイリアスを付ける例
<?php
// Html名前空間に H という別名を付ける
use Html as H;
$table = new H\Table();
?>4.2 クラスにエイリアスを付ける例
<?php
// Html\Tableクラスに T という別名を付ける
use Html\Table as T;
$table = new T();
?>