名前空間のメモ : PHP

Pocket

PHPの名前空間(namespace)の覚書です。

  1. useを使ったインポートは必ず完全修飾形式と解釈されるためバックスラッシュを先頭へつける必要ありません。
  2. use以外は先頭にバックスラッシュがないときは相対指定と解釈されます。
  3. 名前空間内でグローバル空間のクラスや関数を指定するときはクラス名の前にバックスラッシュ(\)をつ行けます。
// 3の例
$d = new \DateTime('2016-01-01'); 

名前解決

  • 名前空間が定義されているとき関数は最初に名前空間内を探索し、見つからないときはグローバル空間を探索します。
  • 名前空間が定義されているときクラスは名前空間内を探索します。グローバル空間は探索しません。

use句でインンポート

useを使ったインポートは必ず完全修飾形式と解釈されるためバックスラッシュを先頭へつける必要はありません。  
PHPマニュアルは下記のようにバックスラッシュは記載しないことを推奨しています。

名前空間つきの名前 (完全修飾形式の名前空間は区切り文字を含んだ Foo\Bar のようなもので、グローバルな場合は区切り文字を含まない FooBar のようになります) では先頭のバックスラッシュは不要で、推奨されないことに注意しましょう。 インポートする名前は完全修飾形式でなければならず、 現在の名前空間からの相対指定で処理されることはないからです。

PHP: 名前空間の使用法: エイリアス/インポート – Manual

use句以外でインポート

namespace My

use Foo/Bar; // use句のインポート グローバルな名前空間のFoo/Barをインポート(/Foo/Bazrと同値)

class Some {
    __construct() {
        $foo_bar = new Bar();            // use句でインポートしたクラスの利用。
        $hoge_piyo = new \Hoge\Piyo();   // use句以外で完全修飾名によりインポートするには先頭にバックスラッシュが必要。
        $my_foo_bar = new Hoge\Piyo()    // use句以外で先頭にバックスラッシュを付けないときは相対指定。 (あれば)My\Hoge名前空間のPiyoクラスのインスタンス作成(グローバルは探索しません。) 
    }
}

コンポーネントのマッピング

PackagistはComposerのパッケージポータルです。コンポーネントをPackagistへ登録するときはコンポーネントのcomposer.jsonへ名前空間をコンポーネント内のどのディレクトリへマッピングするかautoloaderへ知らせるための記載が必要です。

Beneath the psr-4 property, you map the component’s namespace prefix to a filesystem path relative to the component’s root directory.

出典 Modern PHP: New Features and Good Practices

monolog
    |
    monolog
        |
        |--src
            |
            |-- Monolog
                |
                |-- ....
        |
        |-- composer.json

composer.json

{
  ...
  "autoload": {
        "psr-4": {"Monolog\\": "src/Monolog"}
    },
}

composer.jsonのautoloadプロパティへ設定する名前空間の区切りはバックスラッシュ2つです。
(JSONはバックスラッシュをエスケープする必要があるためです。)

パッケージ利用例(Monolog)

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

class Some {

    function log() {
        $log = new Logger('Monolog');
        $log->pushHandler(new StreamHandler('./monolog.log', Logger::DEBUG));
        $log->addInfo('Information.');
        $log->addError('Error message : ' . __DIR__ );
        $log->addDebug('Debug message.: ' . __DIR__ );
    }
}

人気記事 はてなブックマーク

この日記のはてなブックマーク数