此代码不起作用。为什么不?PHP runkit_function_rename不起作用?
<?php
function test()
{
echo 'test';
}
runkit_function_rename('test', 'test2');
test2();
?>
我真正想要的是这个。我正在使用一个有功能的系统。当我在本地主机上时,我希望该功能可以做一些不同的事情。我想用自己的东西覆盖功能。
所有的替代品也欢迎。
此代码不起作用。为什么不?PHP runkit_function_rename不起作用?
<?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.
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
,使同样的功能做不同的事情。
是的,我尝试了重新定义函数。可能会缺少一些要安装的东西。在这种情况下,代码示例对我无效。我不能改变这个功能,因为它在核心。这就是为什么我想重写它。 – 2011-04-27 19:49:22
您可以使用正确的'php.ini'设置使用runkit更改核心功能,但必须安装runkit,这似乎是您的更大问题。 – ceejayoz 2011-04-27 19:51:50
如前所述,它可能是最好的一个函数体的内部分化关于$ _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
我从来没有对Runkit有过任何运气。
您要求的替代品,我可以肯定推荐这一个:
拼布是一个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是你唯一明智的选择。
“不工作”是什么意思?你是否收到某种错误信息? – 2011-04-27 19:28:00
为什么不实现两个类和一个工厂,根据脚本运行的当前服务器提供其中一个实例?另外:你的主机上安装了runkit吗? – SteAp 2011-04-27 19:30:37
@Pascal。我得到了“致命错误:调用第6行C:\ wamp \ www \ concepts \ runkit \ index.php中的未定义函数runkit_function_rename()”。 – 2011-04-27 19:42:53