PHP runkit_function_rename don't work?


PHP runkit_function_rename don't work?

这段代码不起作用。为什么不呢?

<?php
function test()
{
    echo 'test';
}
runkit_function_rename('test', 'test2');
test2();
?>
我真正想要的是这个。我用的是一个有函数的系统。当我在本地主机上时,我希望这个函数做一些不同的事情。我想用自己的东西重写函数

是否安装了PECL扩展?

http://www.php.net/manual/en/runkit.installation.php

This » PECL extension is not bundled with PHP.

我用Runkit也从来没有运气。

你问了其他选择,我可以绝对推荐这个:

拼凑

Patchwork是一个PHP的函数覆盖库。换句话说,它做的工作和Runkit差不多。

最主要的区别是它是用纯PHP编写的——不需要安装扩展;只要在你的代码的顶部有一个require_once()

这样做的另一面是,因为它是纯PHP,它只能替换程序中定义的函数;也就是说,它不能像Runkit那样覆盖PHP内置函数。你的问题中的例子可以很好地与Patchwork一起工作,但试图覆盖像mysql_query()这样的PHP函数是不可能的。

然而,与Runkit不同的是,它可以完美地工作,所以如果你能忍受这个限制,我强烈推荐它。

您可能想要尝试的另一个替代Runkit的方法是PHP Test Helpers。这是一个PHP扩展,涵盖了与Runkit几乎相同的基础。它和PHPUnit是同一个作者写的,所以应该很好。然而,当我尝试安装这个时,我也没有太多的乐趣,所以我不能对它发表太多评论。

我注意到你在其他地方对这个问题的评论,你正在运行Windows(即WAMP)。Runkit和PHP测试助手都没有提供Windows可执行文件;为了在Windows中使用它们中的任何一个,你需要自己从C源代码编译扩展。因此,如果你使用的是Windows,那么Patchwork是你唯一明智的选择。

我真正想要的是这个。我用的是一个有函数的系统。当我在本地主机上时,我希望这个函数做一些不同的事情。我想用自己的东西重写函数

也欢迎所有替代方案。

function test() {
  if($_SERVER['HTTP_HOST'] == 'localhost' {
     // do one thing
  } else {
     // do other thing
  }
}

如果你设置使用runkit,你需要使用runkit_function_redefine,而不是runkit_function_rename使相同的功能做不同的事情。

如前所述,最好在函数体内部区分$_SERVER['HTTP_HOST']的值。

虽然我个人认为这是一种糟糕的风格,但你甚至可以在其他函数或块中定义函数。

这个代码段定义了一个函数get_template_part():

if($_SERVER['HTTP_HOST'] == 'localhost' {
  function get_template_part() {
  }
} else {
  function get_template_part() {
  }
}

不幸的是,这对您的情况没有帮助,因为get_template_part()已经在您的范围之外定义了。

有些人可能还会遇到runkit_function_*函数不工作的情况,尽管runkit库已正确安装。这是因为这些函数在某些PHP版本(可能至少所有的5.2.*)中被破坏了,如下图所示:https://bugs.php.net/bug.php?id=58205