重新定义内置PHP函数

重新定义内置PHP函数,php,Php,我想重新定义PHP中已经构建的某些函数,例如echo()或time()——我不需要全局定义这些函数,只需在单个脚本中进行测试 我认为这可以在Perl中完成,但在PHP中——这可能吗 -用新的实现替换函数定义 注意:默认情况下,只能删除、重命名或删除用户空间函数 被改进的。为了超越 内部函数,必须启用 runkit.internal\u覆盖设置 在php.ini中 您可能还想退房 -覆盖内置函数 从包裹里拿出来 但是,必须重新定义本机PHP函数或语言语句应该会敲响警钟。在我看来,这不应该是生产代码

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

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

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

注意:默认情况下,只能删除、重命名或删除用户空间函数 被改进的。为了超越 内部函数,必须启用 runkit.internal\u覆盖设置 在php.ini中


您可能还想退房

-覆盖内置函数

从包裹里拿出来

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

另一个选择是使用

Patchwork是一个PHP库,它可以在运行时重新定义用户定义的函数和方法,松散地复制纯PHP5.3代码中的功能
runkit\u function\u redefinite
,这使您能够用测试双精度替换静态和私有方法


后者不适用于本机函数,尽管echo不是函数,而是语言构造。我没有这方面的资料

但是像
time()
这样的函数调用可以被重写,因为:

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

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

就个人而言,我用它来模拟单元测试,例如
time()
。我在图书馆发布了这些模拟:


这对所有PHP脚本都有全局影响,还是特定于特定脚本?编辑PHP.ini文件将影响在特定PHP安装上运行的所有PHP脚本。然而,函数重新定义本身是为runkit调用
runkit\u function\u redefinite()
+1的脚本所独有的,因为APD有点笨重,它会弄乱进程退出代码,在测试用例中使用它会导致中断。我在测试用例中使用runkit拦截mt_rand()和time(),我是一个快乐的露营者。除了测试目的之外,runkit是生产环境的一个有价值的解决方案吗?我想将其与一个解决方案结合使用,我无法修改该解决方案,以允许后台用户在将来通过重写time()和任何其他相关函数预览他们的前台。我是否应该停止在Runkit的思考,开始重写产品的大多数类?@ChrisNash,Happy camper。。。什么意思?@Gordon-谢谢你的建议。我只是想做这个测试的目的,而不是生产代码-你是对的,它确实敲响了警钟!可能重复的。。。为什么会有人这么做?
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());
    }
}