重新定义内置的PHP函数

时间:2010-02-24 14:50:11

标签: php

我想重新定义已经构建的PHP中的某些函数,例如echo()或time() - 我不需要在一个脚本中全局定义这些函数,只是在一个脚本中进行测试。

我认为这可以在Perl中完成,但在PHP中 - 这可能吗?

3 个答案:

答案 0 :(得分:17)

  

runkit_function_redefine - 用新的实现替换函数定义

     

注意:默认情况下,只有用户空间功能可能会被删除,重命名或   改性。为了覆盖   内部函数,您必须启用   runkit.internal_override设置   在php.ini。

答案 1 :(得分:6)

您可能还想查看

override_function() - 覆盖内置函数

来自Advanced PHP debugger包。

重新定义本机PHP函数或语言语句应该响起警钟。在我看来,这不应该是您的生产代码的一部分,除非您正在编写调试器或类似的工具。

另一种选择是使用http://antecedent.github.io/patchwork

  

Patchwork是一个PHP库,可以在运行时重新定义用户定义的函数和方法,在纯PHP 5.3代码中松散地复制功能runkit_function_redefine,除此之外,还可以替换静态和私有方法与测试双打。

后者不适用于本机功能

答案 2 :(得分:1)

echo不是函数,它是一种语言结构。我没有任何相关的东西。

但是time()之后可以覆盖time()之类的函数调用:

  

对于函数[...],如果命名空间函数[...]不存在,PHP将回退到全局函数[...]。

E.g。对于非全局命名空间foo中的非限定函数调用foo\time(),您可以提供time()

我个人用这个来模仿,例如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()); } } 进行单元测试。我在图书馆PHP-5.3's namespace fallback policy中发布了这些模拟:

{{1}}