【PHP】 名前空間の使い方

PHPでは、名前空間を使用できます。名前空間を使用することで、他ライブラリと自身のコードで関数名やクラス名などの重複を心配すること無くコードを書くことができるようになります。

名前空間のメリット

名前空間のメリットは、特定の名前でグループ化することで、名前が衝突しないようにできるという点です。

名前空間のメリット

例えば、

class SendMail {
    // ...
}

というクラスを作成してメール送信周りを管理していたとします。ここにライブラリを導入したところ、同じSendMailというクラスがあったらどうでしょうか。名前が被ってしまうため、改名せざるを得ません。

名前空間に入れることで、そういった衝突を回避できるようになります。

名前空間に包む

まずは名前空間に包んでみましょう。namespaceを用いますが、2種類の書き方があります。

ファイル全体を名前空間に入れる

そのファイルのコード全体を名前空間内に入れたい場合、namespace 名前;を書くだけです。

namespace MyUtility;

function trim() {
    // ...
}

class Hoge {
    // ...
}

一部を名前空間に入れる

ファイル全体ではなく、一部だけを入れたい場合、波括弧で囲みます。

namespace MyUtility {
    function trim() {
        // ...
    }
    
    class Hoge {
        // ...
    }
}

namespace MyFuga {
    // ...
}

// ここはグローバル

名前空間の区切り

名前空間は、バックスラッシュで区切った名前にすると、ネストしているような感覚で使用できます。つまり、フォルダパスのような感覚で名前をつけられます。

namespace MyFoo\Bar {
    function f() {
        // ...
    }
}

namespace MyFoo\Bar\Baz {
    function f() {
        // ...
    }
}

namespace MyFoo\Bar\Hige {
    // ...
}

ネストすることはできません。

namespace MyFoo {
    // NG Namespace declarations cannot be nested
    namespace Bar {
        function f() {};
    }
}

名前空間内のものを使う

外から名前空間内のものを呼び出したい場合は、完全修飾名を用いるか、useを用います。

自分の名前空間にあるものは特に何もする必要はありません。

namespace MyUtility {
    function trim() {
        // 同じ名前空間ならそのまま使用できる
        $hoge = new Hoge;
    }
    
    class Hoge {
        // ...
    }
}
useする場合
// classの場合
use MyUtility\Hoge;
$hoge = new Hoge();

// functionの場合
use function MyUtility\trim;
trim();
完全修飾名の場合
$hoge = new \MyUtility\Hoge();

\MyUtility\trim();

ここで、完全修飾名を使用する場合で、使用する側が何らかの名前空間内にある場合を考えると、必ずバックスラッシュから始めるべきです。

namespace Aaa {
    function f() {
        // エラー。 Aaa\MyUtility\trim を呼び出すことになる (それを想定していたとしても、紛らわしいので避けたほうが良い)
        // MyUtility\trim();

        // OK
        \MyUtility\trim();
    }
}

つまり、名前空間内のものを使用する際にバックスラッシュから始めることで、絶対パスのように書けるということになります。反対に、バックスラッシュからではない場合は、相対パスのように扱われます。

まとめ

名前空間を用いることで、フレームワークやライブラリなどとのクラス名や関数名などの衝突を恐れずに名前をつけることができるようになります。

PHP使いたてではあまり使用しないかもしれませんが、Laraveなどのフレームワークを使いだすと多用するので必ず把握しておきましょう!

laravel namespace thumb

役に立ったらシェアしよう!