您可以使用回退策略为像 time() 这样的内置函数提供模拟。因此,您必须调用这些函数时不带限定符
<?php
namespace foo;
function time() {
return 1234;
}
assert (1234 == time());
?>
但是有一个限制,您必须在被测试类的第一个方法中使用之前定义模拟函数。这在 Bug #68541 中有说明。
您可以在 GitHub 上找到模拟库 php-mock。
(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";
}
?>
您可以使用回退策略为像 time() 这样的内置函数提供模拟。因此,您必须调用这些函数时不带限定符
<?php
namespace foo;
function time() {
return 1234;
}
assert (1234 == time());
?>
但是有一个限制,您必须在被测试类的第一个方法中使用之前定义模拟函数。这在 Bug #68541 中有说明。
您可以在 GitHub 上找到模拟库 php-mock。