命名空间关键字和 __NAMESPACE__ 魔术常量

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

PHP 支持两种抽象访问当前命名空间内元素的方法:**__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 命名空间运算符,在命名空间内

<?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 的静态方法 "method"
$a = new namespace\sub\cname(); // 实例化类 MyProject\sub\cname 的对象
$b = namespace\CONSTANT; // 将常量 MyProject\CONSTANT 的值分配给 $b
?>

示例 #5 命名空间运算符,在全局代码中

<?php

namespace\func
(); // 调用函数 func()
namespace\sub\func(); // 调用函数 sub\func()
namespace\cname::method(); // 调用类 cname 的静态方法 "method"
$a = new namespace\sub\cname(); // 实例化类 sub\cname 的对象
$b = namespace\CONSTANT; // 将常量 CONSTANT 的值分配给 $b
?>

添加笔记

用户贡献笔记 3 条笔记

a dot schaffhirt at sedna-soft dot de
14 年前
如果您想知道命名空间关键字的实际用途...

它可以显式地引用当前命名空间中的类,而无论可能已使用 "use" 语句从其他命名空间导入的同名类。但是,这并不适用于函数。

示例

<?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(); // 实例化 \foo\Xyz
new namespace\Xyz(); // 实例化 \bar\Xyz
abc(); // 调用 \bar\abc,无论第二个 use 语句如何
\foo\abc(); // 必须使用完全限定名调用
?>

希望这可以帮助某些人避免一些麻烦。

此致。
bharatthapa45 at gmail dot com
2 年前
我发现 __NAMESPACE__ 和关键字 'namespace' 之间的相关区别在于调用类时

<?php
namespace MyApp;

class
App {
static function
app(){
echo
'hello app';
}
}

// 这将起作用:
$obj = new namespace\App::app();

// 这将不起作用
$obj = new __NAMESPACE__\App::app();

// 但是这将起作用:
$obj = __NAMESPACE__ . '\App';
$obj::foo();

?>
cornichonche at gmail dot com
6 年前
示例 4 是错误的。
使用 php 7.2

<?php
namespace monProjet;

use function
blah\blah as mine;

blah\mine(); // 将不起作用
mine(); // 将起作用
?>
To Top