(PHP 5 >= 5.3.0, PHP 7, PHP 8)
名前空間の使い方についてあれこれ言う前に、まずは PHP がどのようにしてコード中の要素の名前空間を知るのかを理解しておくことが重要です。 PHP の名前空間は、ファイルシステムにたとえて考えることができます。 たとえば、ファイルシステム内のファイルにアクセスするには次の 3 つの方法があります。
foo.txt
のような相対ファイル名を使う。これは
currentdirectory/foo.txt
と解釈されます。ここで、
currentdirectory は現在いるディレクトリを表します。したがって、カレントディレクトリが
/home/foo
であった場合はこれは /home/foo/foo.txt
となります。
subdirectory/foo.txt
のような相対パス名を使う。これは
currentdirectory/subdirectory/foo.txt
と解釈されます。
/main/foo.txt
のような絶対パス名を使う。これは
/main/foo.txt
と解釈されます。
$a = new foo();
あるいは
foo::staticmethod();
のような非修飾名
あるいはプレフィックスなしのクラス名。
現在の名前空間が currentnamespace
である場合、これは
currentnamespace\foo
と解釈されます。
名前空間に属さないグローバルなコードにおいては、これは
foo
と解釈されます。
注意: 修飾されていない関数や定数は、名前空間内にその関数や定数がなければ
グローバルな関数あるいは変数とみなされます。詳細は
名前空間の使用法:
グローバルな関数/定数への移行 を参照ください。
$a = new subnamespace\foo();
あるいは
subnamespace\foo::staticmethod();
のような修飾名
あるいはプレフィックスつきクラス名。
現在の名前空間が currentnamespace
である場合、これは
currentnamespace\subnamespace\foo
と解釈されます。
名前空間に属さないグローバルなコードにおいては、これは
subnamespace\foo
と解釈されます。
$a = new \currentnamespace\foo();
あるいは
\currentnamespace\foo::staticmethod();
のような完全修飾名
あるいはグローバルプレフィックス演算子つきのクラス名。
これは、常にコードで記述されたとおりの名前である
currentnamespace\foo
と解釈されます。
これら 3 つの構文を実際のコードで使う例を次に示します。
file1.php
<?php
namespace Foo\Bar\subnamespace;
const FOO = 1;
function foo() {}
class foo
{
static function staticmethod() {}
}
?>
file2.php
<?php
namespace Foo\Bar;
include 'file1.php';
const FOO = 2;
function foo() {}
class foo
{
static function staticmethod() {}
}
/* 非修飾名 */
foo(); // Foo\Bar\foo 関数と解釈されます
foo::staticmethod(); // Foo\Bar\foo クラスの staticmethod メソッドと解釈されます
echo FOO; // 定数 Foo\Bar\FOO と解釈されます
/* 修飾名 */
subnamespace\foo(); // Foo\Bar\subnamespace\foo 関数と解釈されます
subnamespace\foo::staticmethod(); // Foo\Bar\subnamespace\foo クラスの
// staticmethod メソッドと解釈されます
echo subnamespace\FOO; // 定数 Foo\Bar\subnamespace\FOO と解釈されます
/* 完全修飾名 */
\Foo\Bar\foo(); // Foo\Bar\foo 関数と解釈されます
\Foo\Bar\foo::staticmethod(); // Foo\Bar\foo クラスの staticmethod メソッドと解釈されます
echo \Foo\Bar\FOO; // 定数 Foo\Bar\FOO と解釈されます
?>
グローバルなクラス、関数あるいは定数にアクセスするには、完全修飾名を使用して
\strlen()、\Exception あるいは
\INI_ALL
などとすることができます。
例1 グローバルなクラス、関数および定数への名前空間内からのアクセス
<?php
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
$a = \strlen('hi'); // グローバル関数 strlen をコールします
$b = \INI_ALL; // グローバル定数 INI_ALL にアクセスします
$c = new \Exception('error'); // グローバルクラス Exception のインスタンスを作成します
?>