2010-02-24 89 views
19

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

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

+1

可能重复(http://stackoverflow.com/问题/ 1837184/is-it-it-may-replace-a-function-in-php-such-as-mail-and-make-it-do-someth) – outis 2012-02-10 17:13:06

+1

... [有可能取代(monkeypatch )PHP函数?](http:// stackoverflow。com/q/530649 /),[Php redefine Class Methods OR Class](http://stackoverflow.com/q/137006/) – outis 2012-02-10 17:22:26

+0

...为什么有人会这样做? – 2014-11-30 21:22:33

回答

17

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

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

+0

这是否对所有PHP脚本具有全局影响,还是特定于特定脚本? – Abs 2010-02-24 14:57:21

+0

取决于您正在编辑的php.ini文件的范围。 – Dolph 2010-02-24 14:58:19

+4

编辑php.ini文件将影响在特定安装的PHP上运行的所有PHP脚本。然而,函数redifinition本身对调用'runkit_function_redefine()'的脚本是唯一的。 – 2010-02-24 14:58:34

6

您可能也想看看

override_function() - 从Advanced PHP debugger包覆盖内置函数

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

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

碎料是一个PHP库,使得可以在运行时重新定义用户定义的功能和方法,松散地复制功能runkit_function_redefine纯PHP 5.3代码,其中,除其他外,您可以使用测试双打替换静态和私有方法。

后者不适合本地函数的工作,虽然

+0

@戈登 - 感谢您的建议。我只是想做这个测试的目的,而不是生产代码 - 你是对的,它响铃警钟! – Abs 2010-02-24 15:19:36

1

echo不是一个函数,它是一种语言结构。我什么都没有。

但是函数调用像time()可以自PHP-5.3's namespace fallback policy覆盖:

对于函数[...],PHP将回落至全局函数[...]如果一个命名空间功能[...]不存在。

例如,对于非全局名称空间foo中的非限定函数调用time(),您可以提供foo\time()

我个人用这个来模拟例如time()用于单元测试。我发表在图书馆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()); 
    } 
} 
的[?是否有可能在PHP(如邮件)更换功能,利用它做些别的事情]