PHP 名前空間

こんにちは。webチームの黒岩です。
今回は、PHPの名前空間とは何か、使い方を解説いたします。

名前空間とは

PHPの名前空間とは、プログラムの中で、同じ関数名やクラス名を使っても競合しないように「区分け」する仕組みです。

PHPでは、プログラムの中で同じ名前の関数やクラスを定義するとエラーになってしまいます。
ソースコードの少ない小規模なアプリを1人で開発している分には、それほど問題は起きないのですが、複数人で開発したり、ソースコードの規模が大きくなる場合は、他の誰かが付けた関数名やクラス名とたまたま被ってしまうことがあるかもしれません。
また、外部のライブラリなどを使用する場合も、そのライブラリの中で定義されている関数名やクラス名と被ってしまうとエラーが発生してしまいます。
名前を考え直すかちょっと長くすればいいことでは?と思うかもしれませんがそれだとソースコードが長くなってしまいますし、何より、「ダサく」なってしまうのでなるべく避けたい。

そんな時に便利なのが「名前空間」という仕組みです。
名前空間を指定すると、それぞれは独立した空間となり、その中では自由に名前を付けることが可能になります。
別の空間に同じ名前の関数やクラスがあったとしても、競合することはありません。

実際に作ってみる

PHPでは、名前空間は namespace というキーワードを使って指定します。
このように書くと「GroupA」という名前空間を指定したことになります。

<?php
namespace GroupA;

この指定の後に続けて書いた関数やクラスは、GroupAの名前空間に属する形になります。

例えばsend()というありふれた名前の関数を書いても、GroupAという名前空間の中に定義しているので他のところで同じ名前の関数を書いてもエラーにはなりません。

<?php
namespace GroupA;

function send() {
    echo 'I has been contained in GroupA'
}

注意!!

namespaceの行よりも前にPHPの他の命令(declare は除く)や、HTMLタグなどを書くとエラーになります。

<html><!-- ←エラー!! -->
<?php
    namespace GroupA;

必ず一番上、冒頭で指定するようにしましょう。

呼び出してみる

別ファイル b.phpで今さっき作った名前空間GroupAを呼び出してみましょう。

先ず何より最初に、名前空間を指定しているファイルを読み込まないと何も始まりません。

<?php
require_once 'a.php';

先ほど作った名前空間の中にある関数を呼び出す際は下のように書きます。
「名前空間名\関数名;」と指定することで、その名前空間の中にある関数を呼び出すことができるんですね。

<?php
require_once 'a.php';

GroupA\send();

Javascript等を書きなれている筆者にとってはかなり違和感を覚える書き方ですね‥。(笑)

応用

サブ名前空間

名前空間はこのように1つだけでなく、階層を区切って細かく指定することもできます。

これを「サブ名前空間」といいます。

<?php
namespace GroupA\Common\Mail;

function send() {
...

このように、ディレクトリ構造のように枝分かれさせることもできるわけですね。
呼び出し方は無論こうすればOKです。

<?php
require_once 'a.php';

GroupA\Common\Mail\send();

エイリアス

サブ名前空間を使って、名前空間の指定が長くなってしまう場合、この指定を毎回書くのは面倒ですよね。

そんな時は「use」キーワードを使うことで、名前空間のエイリアスを作ることができます。
このように書くと「GroupA\Common\Mail」を「Mail」というエイリアス名で定義することが可能なわけです。(因みにLaravelでも同じようにできます)

エイリアスを使用することによって、関数を呼び出す際は、「Mail\send();」と書くだけで呼び出せるようになります。

<?php
require_once 'a.php';

use GroupA\Common\Mail as Mail;
Mail\send();

これは是非とも覚えてほしいです。