包含的文件将默认为全局命名空间。
<?php
//test.php
namespace test {
include 'test1.inc';
echo '-',__NAMESPACE__,'-<br />';
}
?>
<?php
//test1.inc
echo '-',__NAMESPACE__,'-<br />';
?>
test.php 的结果
--
-test-
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
在没有任何命名空间定义的情况下,所有类和函数定义都将放置在全局空间中 - 就像在支持命名空间之前在 PHP 中一样。在命名空间的上下文中,用 \
作为前缀将指定需要从全局空间获取名称。
示例 #1 使用全局空间规范
<?php
namespace A\B\C;
/* 此函数为 A\B\C\fopen */
function fopen() {
/* ... */
$f = \fopen(...); // 调用全局 fopen
return $f;
}
?>
包含的文件将默认为全局命名空间。
<?php
//test.php
namespace test {
include 'test1.inc';
echo '-',__NAMESPACE__,'-<br />';
}
?>
<?php
//test1.inc
echo '-',__NAMESPACE__,'-<br />';
?>
test.php 的结果
--
-test-
请注意,变量不属于命名空间,因此它们始终是全局的(或作用域到函数等),并且不能像其他命名空间内容一样访问。
所以不是
namespace Foo;
$var = "hello";
echo \Foo\$var;
在命名空间上下文中,Exception 类需要使用全局前缀运算符。
<?php
namespace hey\ho\lets\go;
class MyClass
{
public function failToCatch()
{
try {
$thing = somethingThrowingAnException();
} catch (Exception $ex) {
// 未捕获
}
}
public function succeedToCatch()
{
try {
$thing = somethingThrowingAnException();
} catch (\Exception $ex) {
// 现在已捕获
}
}
}
要定义一个关联数组(哈希),使其成为命名空间的一部分,而不是进入全局命名空间,只需将其声明为 const,而不是变量。
这对查找表、配置设置等很有用。
// 例如。不要写
$my_datatypes = [
"sterility" => [
"xlsx" => [
"Sample Type",
"Run Pass/Fail",
"Result"
],
"db" => [
"SampleType",
"RunPassFail",
"Result"
]
]
];
// ...像这样声明查找表
const MY_DATATYPES = [
"sterility" => [
"xlsx" => [
"Sample Type",
"Run Pass/Fail",
"Result"
],
"db" => [
"SampleType",
"RunPassFail",
"Result"
]
]
];
// ...它将在当前命名空间中声明。
这种访问全局名称的设计很糟糕,至少很不方便。
如果您有一些旧代码,并且尝试将其复制并在某个命名空间下重新使用。您必须在任何全局函数调用上添加前缀 "\"。