此代碼不起作用。爲什麼不?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