namespace キーワードおよび __NAMESPACE__ 定数
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
PHP には、現在の名前空間内の要素へのアクセスを抽象化するための方法が 2 通りあります。
マジック定数 __NAMESPACE__
および namespace
キーワードがそれです。
__NAMESPACE__
の値は文字列で、現在の名前空間の名前が格納されます。
名前空間に属さないグローバルなコードでは、この中身は空文字列となります。
例1 名前空間内のコードでの __NAMESPACE__ の例
<?php
namespace MyProject;
echo '"', __NAMESPACE__, '"'; // "MyProject" と出力します
?>
例2 グローバルなコードでの __NAMESPACE__ の例
<?php
echo '"', __NAMESPACE__, '"'; // "" と出力します
?>
__NAMESPACE__
定数は、動的に名前を作成する場合に便利です。
たとえば次のようになります。
例3 __NAMESPACE__ による動的な名前の作成
<?php
namespace MyProject;
function get($classname)
{
$a = __NAMESPACE__ . '\\' . $classname;
return new $a;
}
?>
namespace
キーワードを使用すると、
現在の名前空間あるいはサブ名前空間内の要素を明示的に指定することができます。
これは、クラスにおける self
演算子と同じ意味合いのものです。
例4 名前空間内での namespace 演算子
<?php
namespace MyProject;
use blah\blah as mine; // "名前空間の使用法: エイリアス/インポート" を参照ください
blah\mine(); // MyProject\blah\mine() 関数をコールします
namespace\blah\mine(); // MyProject\blah\mine() 関数をコールします
namespace\func(); // MyProject\func() 関数をコールします
namespace\sub\func(); // MyProject\sub\func() 関数をコールします
namespace\cname::method(); // MyProject\cname クラスのstaticメソッド "method" をコールします
$a = new namespace\sub\cname(); // MyProject\sub\cname クラスのオブジェクトのインスタンスを作成します
$b = namespace\CONSTANT; // 定数 MyProject\CONSTANT の値を $b に代入します
?>
例5 グローバルコードでの namespace 演算子
<?php
namespace\func(); // func() 関数をコールします
namespace\sub\func(); // sub\func() 関数をコールします
namespace\cname::method(); // cname クラスのstaticメソッド "method" をコールします
$a = new namespace\sub\cname(); // sub\cname クラスのオブジェクトのインスタンスを作成します
$b = namespace\CONSTANT; // 定数 CONSTANT の値を $b に代入します
?>
+add a note
User Contributed Notes 2 notes
a dot schaffhirt at sedna-soft dot de ¶
14 years ago
Just in case you wonder what the practical use of the namespace keyword is...
It can explicitly refer to classes from the current namespace regardless of possibly "use"d classes with the same name from other namespaces. However, this does not apply for functions.
Example:
<?php
namespace foo;
class Xyz {}
function abc () {}
?>
<?php
namespace bar;
class Xyz {}
function abc () {}
?>
<?php
namespace bar;
use foo\Xyz;
use foo\abc;
new Xyz(); // instantiates \foo\Xyz
new namespace\Xyz(); // instantiates \bar\Xyz
abc(); // invokes \bar\abc regardless of the second use statement
\foo\abc(); // it has to be invoked using the fully qualified name
?>
Hope, this can save someone from some trouble.
Best regards.
bharatthapa45 at gmail dot com ¶
2 years ago
Difference between __NAMESPACE__ and keyword 'namespace' that I find relevant is when invoking a class:
<?php
namespace MyApp;
class App {
static function app(){
echo 'hello app';
}
}
// this will work:
$obj = new namespace\App::app();
// this will not work
$obj = new __NAMESPACE__\App::app();
// however this will work:
$obj = __NAMESPACE__ . '\App';
$obj::foo();
?>
![To Top](/images/to-top@2x.png)