名前空間はファイルの先頭で宣言する
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();