2013-02-21 64 views
1

WordPress CMS的正常安裝由數百個腳本,插件和主題組成。這個概念允許通過簡單地創建它的副本來替換腳本,並將修改過的版本放在正確的目錄中。 但是,當安裝新版本的腳本或插件時,複製的腳本將不會更新。在腳本中通常有數百個函數。更改一個功能的成本是其他功能也不再更新。 在很多情況下,Wordpress掛鉤和過濾器足以添加或抑制特定功能,但並非總是如此。重新聲明一個php函數

我正在尋找一種重新聲明或重載函數的方法,以便在安裝更新時可以用CMS替換原始腳本。我試過這個:

rename_function('wp_function' , 'old_wp_funtion) 

function wp_function(){ 
     // things to do before the function 
    $a = $b; 
     // call the old function 
    $result = old_wp_function(); 
     // things to do afterwards 
    $b = $c; 

    return $result; 
} 

但它不起作用。 另外,使用Wordpress你永遠不會知道方面有多少種參數。重載函數也必須處理這個問題。

我的問題是:我如何解決這個問題,讓它在任何情況下都可以使用任何數量和任何類型的參數。 而不必改變任何東西到原來的功能/腳本,因爲它們可能(並且必須)被WordPress更新覆蓋。

+0

我不知道任何'不工作'錯誤在PHP或任何其他語言。順便說一句,你有錯字(在'old_wp_funtion'後面關閉''')。 – Leri 2013-02-21 10:08:30

+0

而且php支持[namespace](http://www.php.net/manual/en/language.namespaces.rationale.php),這是處理函數名稱不明確時常見的方式。 – Leri 2013-02-21 10:09:49

+0

我認爲你需要深入研究你正在努力達到的目標。無論如何,這聽起來像是錯誤的做法。 – Dunhamzzz 2013-02-21 10:24:09

回答

1

PHP不作爲標準支持重新定義函數聲明後。有很多方法可以強制它,但總的來說它被認爲是非常不好的編程習慣,並且非常不鼓勵。

如果你真的想在PHP中重載代碼,你最好在類中編寫代碼而不是普通函數,因爲類可以很容易地擴展,並且方法可以重載。這將是到目前爲止是您的最佳選擇。它可能需要對代碼進行一些修改,但無論如何,最好在類中編寫代碼,所以請考慮一下提高代碼質量的機會。

另一種選擇是使用名稱空間。 PHP 5.3和更高版本支持名稱空間,這意味着您可以多次聲明相同的函數名稱,但是在不同的名稱空間中。如果你的代碼目前沒有使用名稱空間,這可能涉及相當大量的工作來實現,但它可以幫助你做你想做的事情。但我懷疑我之前提到的課程選擇是一個更好的選擇。

具體參考您在此嘗試使用的rename_function()函數:它是a non-standard debugger extension called ADP的一部分;這是一個開發人員的調試器,所以當然不應該用在生產系統中。

如果您決定以您想要的方式進行操作,您可以嘗試的其他選項包括Runkit extension,這是明確設計的,可以讓您準確地考慮您所問的問題。同樣,它僅供開發人員使用,不鼓勵用於生產。

另一種選擇是Patchwork library,它是純PHP代碼(即它不需要安裝PHP擴展)。這使它成爲一個更吸引人的解決方案。但是,作者明確建議不要將其用於開發環境以外的任何其他應用程序。

所以你有它:幾種選擇存在你。如果你需要沿着你描述的路線繼續前進,我建議使用Patchwork庫。

但是我會再說一遍,你所要求的並不是一個好主意 - 大的線索應該是沒有人這樣做,而那些正在做類似事情的人每隔一段時間就會說它不應該用於生產的機會。

它被認爲是一個有用的工具的唯一情況是編寫測試腳本,其中有無法避免的依賴關係。將依賴關係重新定義爲模擬或存根可以爲單元測試編寫其他不可測試的代碼。

但除此之外,來自PHP世界的一致信息是:不要重新定義你的函數。