PHPメモ048:名前空間
名前空間を自分のコードで使ったことはないが、外部のライブラリに使われてることがあるので少し勉強してみた。
名前空間の宣言
名前空間の宣言には namespace を使う。ファイルの先頭で宣言しなければならない。
名前空間の影響を受けるのはクラス(抽象クラスやトレイトを含む)、インターフェイス、関数、定数である。
名前空間はバックスラッシュ(バックスラッシュが表示されない場合は¥)で区切って階層構造にすることができる。
名前空間の使用
名前空間に宣言した関数、クラスなどを使用するには、関数名やクラス名などの前に名前空間を書く。
このとき "\" から書き始めた場合は完全な名前空間、そうでない場合は現在の名前空間からの相対的な名前空間になる。
"\" 単独の場合はグローバル名前空間を示す。現在の名前空間にグローバルな関数・クラス・定数と同じ名前のものがある場合、"\名前" とするとグローバルな関数・クラス・定数を使うことができる。
定義済み定数 __NAMESPACE__ は現在の名前空間が格納される。
namespace キーワードは宣言ではない場合は現在の現在の名前空間である。
以下に例を示す。
namespace1.php
<?php namespace MyNamespace; function printAaa() { print("aaa[MyNamespace]\n"); } function strftime($param) { return "strftime():param={$param}[MyNamespace]"; } class DateTime { public function getTimestamp() { return 9999; } } ?>
namespace2.php
<?php namespace MyNamespace\sub; function printAaa() { print("aaa[MyNamespace\\sub]\n"); } ?>
nmtest1.php。名前空間を完全修飾名で指定する例。
<?php include 'namespace1.php'; include 'namespace2.php'; \MyNamespace\printAaa(); \MyNamespace\sub\printAaa(); ?>
nmtest1.php の実行結果。5行目と6行目はともに関数名はprintAaa()だが、異なる名前空間を付けているので異なる関数が呼ばれる。
aaa[MyNamespace] aaa[MyNamespace\sub]
nmtest2.php。useでエイリアス、インポートする例。また自分で宣言した名前空間とグローバルな名前空間で同じな前の関数、クラスを区別する例。
<?php include 'namespace1.php'; use MyNamespace as nm; use MyNamespace\DateTime; $tmp = nm\strftime('%c'); // \MyNamespace の strftime() print($tmp . "\n"); $tmp = \strftime('%c'); // グローバルな strftime() print($tmp . "\n"); $dt = new DateTime(); // \MyNamespace の DateTimeクラス $tmp = $dt->getTimestamp(); print($tmp . "\n"); $dt = new \DateTime(); // グローバルな DateTimeクラス $tmp = $dt->getTimestamp(); print($tmp . "\n"); ?>
nmtest2.php の実行結果。useキーワードを使用しているので、完全修飾名を使わずに名前空間に属する関数・クラスを使用している。
strftime():param=%c[MyNamespace] 11/03/14 20:43:01 9999 1415014981
nmtest3.php。名前空間を相対で指定する例。
<?php namespace MyNamespace; include 'namespace2.php'; sub\printAaa(); // 相対的に名前空間を指定 ?>
nmtest3.php の実行結果。
aaa[MyNamespace\sub]
参考ページ:
PHP: 名前空間 - Manual
5分で分かる名前空間とオートロード
PHP での名前空間を適切に作成する
« 逗子で釣り | Main | 2014秋アニメ途中経過 »
「PHP」カテゴリの記事
- LaravelでHello World とか諸々(2015.05.13)
- Laravel4のインストール(2015.05.06)
- PHPメモ051:includeとrequireの使い分け(2015.06.19)
- CakePHPのインストール(2015.06.14)
- PHPからPDOでPostgreSQLに接続する(2015.06.09)
TrackBack
TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/60593151
Listed below are links to weblogs that reference PHPメモ048:名前空間:
Comments