2011-04-27 80 views
4

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

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

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

所有的替代品也欢迎。

+1

“不工作”是什么意思?你是否收到某种错误信息? – 2011-04-27 19:28:00

+2

为什么不实现两个类和一个工厂,根据脚本运行的当前服务器提供其中一个实例?另外:你的主机上安装了runkit吗? – SteAp 2011-04-27 19:30:37

+0

@Pascal。我得到了“致命错误:调用第6行C:\ wamp \ www \ concepts \ runkit \ index.php中的未定义函数runkit_function_rename()”。 – 2011-04-27 19:42:53

回答

7

您是否安装了PECL扩展?

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

This » PECL extension is not bundled with PHP. 
+0

不,也许我应该尝试一下。顺便说一句,我使用WAMP。 – 2011-04-27 19:47:27

+2

那么,如果没有安装,你可能会得到一个“找不到功能”的错误,因为该功能在这种情况下不存在:) – Nanne 2011-04-27 20:07:37

+0

Runkit没有提供Windows的可执行文件;你需要自己编译它。 – Spudley 2012-04-19 17:40:16

1

What I really want is this. I'm using a system that have a function. When I'm on localhost I want that function to do something different. I want to override the function with own stuff.

All alternatives are welcome as well.

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

如果你正在使用runkit设置,你需要使用runkit_function_redefine,不runkit_function_rename,使同样的功能做不同的事情。

+0

是的,我尝试了重新定义函数。可能会缺少一些要安装的东西。在这种情况下,代码示例对我无效。我不能改变这个功能,因为它在核心。这就是为什么我想重写它。 – 2011-04-27 19:49:22

+1

您可以使用正确的'php.ini'设置使用runkit更改核心功能,但必须安装runkit,这似乎是您的更大问题。 – ceejayoz 2011-04-27 19:51:50

1

如前所述,它可能是最好的一个函数体的内部分化关于$ _SERVER值[ 'HTTP_HOST']。

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

这个片段定义一个功能get_template_part():

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

    function get_template_part() { 
    } 

} else { 

    function get_template_part() { 
    } 

} 

不幸的是,这不会在你的情况有所帮助,因为get_template_part()是你无法到达已定义。

1

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

2

我从来没有对Runkit有过任何运气。

您要求的替代品,我可以肯定推荐这一个:

Patchwork

拼布是一个PHP函数库覆盖。换句话说,它和Runkit的功能差不多。

主要区别在于它是用纯PHP编写的 - 没有安装扩展;只需在代码顶部输入require_once()即可。

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

但是,与Runkit不同的是,它的工作原理非常完美,所以如果你能忍受这个限制,我会强烈推荐它。

您可能想尝试的Runkit的另一种替代方法是PHP Test Helpers。这是一个PHP扩展,与Runkit几乎一样。它是由PHPUnit编写的,它应该是相当不错的。但是,当我尝试安装这个软件时,我并没有太多的快乐,所以我不能对它进行真正的评论。

我注意到你在这个问题上的其他地方的意见,你正在运行Windows(即WAMP)。 Windows可执行文件不提供Runkit和PHP Test Helpers;为了在Windows中使用它们中的任何一个,您需要自己从C源代码中编译扩展名。出于这个原因,如果你在Windows上,那么Patchwork是你唯一明智的选择。