PHP runkit_function_rename 不起作用?

Posted

技术标签:

【中文标题】PHP runkit_function_rename 不起作用?【英文标题】:PHP runkit_function_rename don't work? 【发布时间】:2011-08-14 03:30:08 【问题描述】:

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

<?php
function test()

    echo 'test';

runkit_function_rename('test', 'test2');
test2();
?>

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

也欢迎所有替代品。

【问题讨论】:

“不工作”是什么意思?您是否收到某种错误消息? 为什么不实现两个类和一个工厂,它提供其中一个的实例,具体取决于脚本运行的当前服务器?另外:您的主机上是否安装了 runkit? @Pascal。我收到“致命错误:在第 6 行的 C:\wamp\www\concepts\runkit\index.php 中调用未定义函数 runkit_function_rename()”。 @Stefan。我不想向系统核心中的函数添加类。我将此添加到 php.ini "runkit.internal_override = On" 但仍然是相同的错误消息。 get_template_part() 是我需要在 Wordpress 中重写的函数。 如果未安装 runkit,则 php.ini 调整将不起作用。这就是它不起作用的原因,这就是为什么告诉我们您遇到的什么错误很有帮助。 【参考方案1】:

您是否安装了 PECL 扩展程序?

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

This » PECL extension is not bundled with PHP.

【讨论】:

没有。也许我应该试试。顺便说一句,我使用 WAMP。 好吧,如果没有安装,你可能会得到一个“未找到函数”的错误,因为在这种情况下该函数不存在:) Runkit 未提供适用于 Windows 的可执行文件;你需要自己编译。【参考方案2】:

我也从来没有使用过 Runkit。

您要求替代品,我绝对可以推荐这个:

Patchwork

Patchwork 是一个 PHP 函数覆盖库。换句话说,它的工作与 Runkit 大致相同。

主要区别在于它是用纯 PHP 编写的 - 无需安装扩展;只是代码顶部的require_once()

另一方面,因为它是纯 PHP,它只能替换程序中定义的函数;即它不能像Runkit 那样覆盖PHP 内置函数。您问题中的示例适用于 Patchwork,但无法尝试覆盖像 mysql_query() 这样的 PHP 函数。

但是,与 Runkit 不同,它可以完美运行,所以如果你能忍受这个限制,我强烈推荐它。

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

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

【讨论】:

【参考方案3】:

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

也欢迎所有替代品。

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

如果您打算使用 runkit,则需要使用 runkit_function_redefine 而不是 runkit_function_rename 来使相同的函数执行不同的操作。

【讨论】:

是的,我尝试了重新定义功能。可能缺少要安装的东西。在这种情况下,代码示例对我不起作用。我无法更改功能,因为它在核心中。这就是为什么我要覆盖它。 您可以使用正确的php.ini 设置使用runkit 更改核心功能,但必须安装runkit,这似乎是您的更大问题。【参考方案4】:

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

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

这个sn-p定义了一个函数get_template_part():

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

  function get_template_part() 
  

 else 

  function get_template_part() 
  


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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于PHP runkit_function_rename 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

php [guzzle php] guzzle php #php

php send.php php邮件模板#php

IntelliJ IDEA 11编辑php是,支持php文件名为.php5和.php4,如何设置能让其也支持.php呢?

如何从php5升级到php7

请问php中如何调用php文件中的内容?

php [php:PHPMailer示例] php库“PHPMailer”示例。 #PHP