2012-01-11 68 views
2

長篇小說我正在使用一個遺留的代碼庫,它大量使用PHP的內置call_user_func_array函數。我試圖讓它使用PHP 5.3(5.2升級)的工作,但已運行到這裏描述的問題(即「傳遞非陣列」一節):我可以擴展內置PHP函數嗎?

http://sixohthree.com/1486/migrating-to-php-5-3-call_user_func_array

簡而言之,問題是在PHP版本5.2和5.3之間,這個函數的行爲被改變了,所以它基本上什麼都不做,並且如果第二個參數不是一個合適的數組/對象/關聯數組,那麼返回NULL。 5.2沒有這樣做,因此我正在使用的代碼庫不會確保它傳遞正確類型的參數。這會導致問題。

要解決這個問題,我可以按照博客文章中的說明去尋找代碼庫中的每一個call_user_func_array調用並修補它們,但這會非常繁瑣。另外,我注意到PHP有一個內置的override_function API調用,可用於覆蓋內置函數。這很方便,但我想要做的更像是擴展內置函數。

理想情況下,我想要的是能夠用的東西大致如下,以取代call_user_func_array實現:

function call_user_func_array($method, $params) { 
    $params = is_array($params) ? $params : array($params); 
    return old_call_user_func_array($method, $params); 
} 

...其中old_call_user_func_array是內置call_user_func_array功能。

這是可能的,如果是這樣,如何?

+2

由於代碼不符合記錄的API,因此它基本上已損壞,您需要在某個時刻修復該功能的每個實例,而不是在修補程序中分層。我可以看到你可能需要一個臨時解決方法,所以無論如何+1。 :) – deceze 2012-01-11 04:40:05

+0

可能重複的http://stackoverflow.com/questions/4725194/php-override-existing功能 – Nazariy 2012-01-11 04:44:18

+1

@Nazariy - 該線程不處理保留舊功能。仔細閱讀OP的問題。 – 2012-01-11 04:49:38

回答

5

您可以使用rename_function這也是在APD延長,所以你應該已經有了,如果你有安裝override_function:

rename_function('call_user_func_array', 'old_user_func_array'); 

function call_user_func_array($method, $params) { 
    $params = is_array($params) ? $params : array($params); 
    old_call_user_func_array($method, $params); 
} 
+0

謝謝,這工作,雖然我發現我不得不通過調用'override_function()'(傳遞原始函數名稱作爲要覆蓋的函數的名稱)來指定新的函數定義。 – aroth 2012-01-11 07:01:00

1

您好,您的問題實際上是在在線PHP文檔中發佈的第三條或第四條評論。在評論部分中通常會有非常有用的信息和示例(請注意,您也有很多事情顯然不正確!)爲了您的方便,我在此複製了相關部分:

...如果您使用rename_function將原始函數重命名爲第三個名稱,然後在OVERRIDING函數中調用第三個名稱,您將獲得所需的效果:

rename_function('strlen','new_strlen');

override_function('strlen','$ string','return override_strlen($ string);');

功能override_strlen($字符串){ 回報new_strlen($字符串);}

0

,或者你可以把你的代碼在一個命名空間:

namespace Phpoverride 
{ 
    function call_user_func_array($method, $params) { 
     return \call_user_func_array($method, $params); 
    } 
} 

http://php.net/namespaces

+0

這並不能真正解決問題,但... – deceze 2012-01-11 05:35:52

相關問題