2011-04-27 81 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是你唯一明智的選擇。