繁体   English   中英

PHP runkit_function_rename 不起作用?

[英]PHP runkit_function_rename don't work?

此代码不起作用。 为什么不?

<?php
function test()
{
    echo 'test';
}
runkit_function_rename('test', 'test2');
test2();
?>

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

也欢迎所有替代方案。

您是否安装了 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 内置 function 可以。 您问题中的示例适用于 Patchwork,但无法尝试像mysql_query()那样覆盖 PHP function 。

然而,与 Runkit 不同的是,它运行良好,所以如果你能忍受这个限制,我强烈推荐它。

您可能想尝试的 Runkit 的另一种替代方法是PHP Test Helpers 这是一个 PHP 扩展,涵盖与 Runkit 几乎相同的领域。 和PHPUnit是同一作者写的,应该还不错。 但是,当我尝试安装它时,我也没有太多的乐趣,所以我不能对此发表太多评论。

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

尽管正确安装了 runkit 库,但有些人可能还会遇到 runkit_function_* 函数不起作用。 这是因为这些功能在某些 PHP 版本(可能至少所有 5.2.*)中被破坏,如下所示: https://bugs.php.net/bug.ZE1BFD762321E40963CEE4ZACid=528C

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

也欢迎所有替代方案。

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

如果您打算使用 runkit,则需要使用runkit_function_redefine而不是runkit_function_rename来使相同的 function 做不同的事情。

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

虽然我个人认为这是不好的风格,但您甚至可以在其他函数或块中定义 function。

这个片段定义了一个function get_template_part():

if($_SERVER['HTTP_HOST'] == 'localhost' {

  function get_template_part() {
  }

} else {

  function get_template_part() {
  }

}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM