重新定义内置的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_redefinefunction,除此之外,您可以使用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()); } }