2024 年 PHP 日本大会

使用命名空间:对函数和常量回退到全局空间

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

在命名空间内,当 PHP 在类名、函数或常量上下文中遇到未限定的名称时,它会以不同的优先级解析这些名称。类名始终解析为当前命名空间名称。因此,要访问内部或非命名空间的用户类,必须使用其完全限定名称引用它们,如

示例 #1 在命名空间内访问全局类

<?php
namespace A\B\C;
class
Exception extends \Exception {}

$a = new Exception('hi'); // $a 是 A\B\C\Exception 类的对象
$b = new \Exception('hi'); // $b 是 Exception 类的对象

$c = new ArrayObject; // 致命错误,找不到类 A\B\C\ArrayObject
?>

对于函数和常量,如果命名空间函数或常量不存在,PHP 将回退到全局函数或常量。

示例 #2 命名空间内的全局函数/常量回退

<?php
namespace A\B\C;

const
E_ERROR = 45;
function
strlen($str)
{
return
\strlen($str) - 1;
}

echo
E_ERROR, "\n"; // 输出 "45"
echo INI_ALL, "\n"; // 输出 "7" - 回退到全局 INI_ALL

echo strlen('hi'), "\n"; // 输出 "1"
if (is_array('hi')) { // 输出 "is not array"
echo "is array\n";
} else {
echo
"is not array\n";
}
?>

添加备注

用户贡献的备注 1 条备注

markus at malkusch dot de
10 年前
您可以使用回退策略为 `time()` 等内置函数提供模拟。因此,您必须调用这些未限定的函数

<?php
namespace foo;

function
time() {
return
1234;
}

assert (1234 == time());
?>

但是,有一个限制,您必须在测试类方法中第一次使用之前定义模拟函数。这在 Bug #68541 中有记录。

您可以在 GitHub 上找到模拟库 php-mock。
To Top