名前空間

名前空間はファイルの先頭で宣言する

namespace命令の前には「<?php」以外の何も存在してはならない。

← ここに余計な改行がある
<?php
	namespace project\foo\bar;
?>

<?php
	class foo {
	}
	//namespace 宣言の前にコードがある
	namespace project\foo\bar;
	class hoge {
	}
?>

複数の名前空間を定義する方法

1ファイルにひとつの名前空間を定義するのが原則ですが、コードを{~}で囲むことで複数定義することも可能。

<?php
namespace foo {
	....
}

namespace bar {
	....
}

呼び出し

グローバル空間にあるクラス/関数/定数は、バックスラッシュ(\)を先頭に追加することで呼び出すことができる。
名前空間の中から関数を呼び出すと同一名前空間内、グローバル空間の順に探す

namespace foo;
//名前空間fooの中で
//バックスラッシュを先頭に付けてグローバル空間を指定 OK
\var_dump('hello world!');

//関数の場合グローバル空間を探すのでOK
var_dump('hello world!');

名前空間の中からクラスを呼び出すとグローバル空間を探さない

namespace foo;
//名前空間fooの中で
//バックスラッシュを先頭に付けてグローバル空間を指定 OK
$obj = new \stdClass;

//クラスの場合グローバル空間を探さない NG
$obj = new stdClass;

被修飾名

名前空間の定義がない、階層区切りのバックスラッシュがない

<?php
	class MyClass {
		...
	}
?>

被修飾名で呼び出すとその名前空間とみなす

namespace project\foo\bar;

require_once 'MyClass.php';
print MyClass::showClass();
//結果 project\foo\bar\MyClass とみなす (グローバル空間を探さない)
//関数は同一名前空間内、グローバル空間の順に探す

修飾名

階層区切り文字(\)を含んだ名前

namespace project\foo;

require_once 'bar/MyClass.php';
print foo\MyClass::showClass();
//結果 project\foo\bar\MyClass

完全修飾名

「 \ 」で始まる修飾名のこと
\project\foo\bar\MyClass
現在の名前空間にかかわらず project\foo\bar\MyClassであるとみなす

require_once 'project/foo/bar/MyClass.php';
print \project\foo\bar\MyClass::showClass();
//結果 project\foo\bar\MyClass

特定の名前空間の中からグローバル名前空間に属するクラスを利用したい場合は、「new \DateTime()」「new \DirectoryIterator()」のように完全修飾名で指定する必要があります。 クラスの場合、自動的にグローバル名前空間を参照するわけではないので、注意!

クラスのインポート

use命令
use命令でインポートするとそれ以降名前空間を省略してクラス名だけで表記できる

require_once './project/foo/bar/MyClass.php';
use project\foo\bar\MyClass;
print MyClass::showClass();

//同じ名前空間から複数のクラスをインポートする場合は、{,,,} でグループ化できる
require_once './project/foo/bar/MyClass2.php';
require_once './project/foo/bar/MyClass3.php';
use project\foo\bar\{MyClass2,MyClass3};

class/functionはじめ、制御構文ブロック配下で呼び出すことはできない。
グローバルスコープ、またはnamespaceブロック配下で呼び出す。

インポートの有効範囲はファイル単位

require_once './project/foo/bar/MyClass.php';
use project\foo\bar\MyClass;

print MyClass::showClass(); //ここはOK

require_once 'include.php';
//include.phpファイルの中で、print MyClass::showClass();はNG

定数/関数のインポート

use const/use function 命令で定数/関数をインポート可能

require_once './project/foo/bar/MyUtil.php';

use const project\foo\bar\AUTHOR;
print AUTHOR;
use function project\foo\bar\MyFunc;
print MyFunc();
<?php
	namespace project\foo\bar;

	const AUTHOR = '著者';

	function MyFunc() {
		return 'こんにちは、PHP!'
	}
?>

名前競合時に別名を設定する

名前が競合するようなケースでは、use命令にas句を付けてクラス/関数に別名(エイリアス)を付与することが可能。

require_once './project/foo/bar/MyClass.php';
require_once './project/foo/bar/sub/MyClass.php';

use project\foo\bar\MyClass;
use project\foo\bar\sub\MyClass as subClass;

print MyClass::showClass();
print subClass::showClass();