My Photo

« 逗子で釣り | Main | 2014秋アニメ途中経過 »

November 03, 2014

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」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

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:名前空間:

« 逗子で釣り | Main | 2014秋アニメ途中経過 »

April 2017
Sun Mon Tue Wed Thu Fri Sat
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof