2024年PHP开发者大会日本站

全局空间

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

添加注释

用户贡献的注释 4条注释

routinet
13年前
包含的文件将默认为全局命名空间。
<?php
//test.php
namespace test {
include
'test1.inc';
echo
'-',__NAMESPACE__,'-<br />';
}
?>

<?php
//test1.inc
echo '-',__NAMESPACE__,'-<br />';
?>

test.php的结果

--
-test-
PhoneixSegovia at gmail dot com
2年前
请注意,变量不是命名空间的一部分,因此它们始终是全局的(或作用域为函数等),并且不能像其他命名空间内容那样访问。

所以不是

namespace Foo;
$var = "hello";
echo \Foo\$var;
nobody at example dot com
9年前
在命名空间上下文中,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) {
// 现在已捕获
}
}

}
dmc60 at cam dot ac dot uk
10个月前
要定义一个关联数组(哈希),使其成为命名空间的一部分,而不是进入全局命名空间,只需将其声明为常量,而不是变量。

这对于查找表、配置设置等非常方便。

// 示例。而不是编写

$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"
]
]
];

// ...它将在当前命名空间中声明。
To Top