2024年PHP开发者大会日本站

命名空间关键字和 __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
?>

添加笔记

用户贡献笔记 2 条笔记

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

它可以显式地引用来自当前命名空间的类,而不管可能“使用”来自其他命名空间的同名类。但是,这并不适用于函数。

示例

<?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();

?>
To Top