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

(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')) { // 打印 "不是数组"
echo "is array\n";
} else {
echo
"is not array\n";
}
?>

添加注释

用户贡献注释 1 注释

36
markus at malkusch dot de
9 年前
您可以使用回退策略为像 time() 这样的内置函数提供模拟。因此,您必须调用这些函数时不带限定符

<?php
namespace foo;

function
time() {
return
1234;
}

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

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

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