重新定义内置的PHP函数
我想重新定义PHP中已经构build的某些函数,例如echo()或time() – 我不需要在全局范围内定义这些函数,只需在一个脚本中进行testing即可。
我认为这可以在Perl中完成,但在PHP中 – 这可能吗?
runkit_function_redefine – 用新的实现replace函数定义
注意:默认情况下,只有用户空间函数可能被删除,重命名或修改。 为了覆盖内部函数,您必须在php.ini中启用runkit.internal_override设置。
你可能也想看看
override_function()
– 覆盖内置函数
从高级PHPdebugging器包。
不得不重新定义本地PHP函数或语言语句,但应该敲响警钟。 除非你正在编写一个debugging器或者类似的工具,否则这不应该是你的产品代码的一部分。
另一种select是使用http://antecedent.github.io/patchwork
Patchwork是一个PHP库,它可以在运行时重新定义用户定义的函数和方法,在纯PHP 5.3代码中松散地复制
runkit_function_redefine
function,除此之外,您可以使用testing双精度代替静态和私有方法。
后者不能用于本机function
echo
不是一个函数,它是一个语言结构。 我什么都没有
但是像time()
这样的函数调用可以被重载,因为PHP-5.3的命名空间后备策略 :
对于函数[…],如果名称空间函数不存在,PHP将回退到全局函数。
例如,对于非全局名称空间foo
中的非限定函数调用time()
,您可以提供foo\time()
。
就我个人而言,我用它来模拟例如time()
进行unit testing。 我在库中发布了这些模拟PHP-Mock :
namespace foo; use phpmock\phpunit\PHPMock; class FooTest extends \PHPUnit_Framework_TestCase { use PHPMock; public function testBar() { $time = $this->getFunctionMock(__NAMESPACE__, "time"); $time->expects($this->once())->willReturn(3); $this->assertEquals(3, time()); } }