簡體   English   中英

我可以擴展內置的PHP函數嗎?

[英]Can I Extend a Built-In PHP Function?

總而言之,我正在使用一個遺留代碼庫,該遺留代碼庫大量使用了PHP的內置call_user_func_array函數。 我正在嘗試使其與PHP 5.3(從5.2升級)一起使用,但是遇到了此處描述的問題(在“傳遞非數組”部分中):

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有一個內置的overlay_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函數。

這可能嗎?如果可以,怎么辦?

您可以使用APD擴展名中的named_function ,因此,如果已安裝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);
}

您好,您的問題實際上在在線PHP文檔中的第三或第四條評論中得到了回答。 在注釋部分中通常有非常有用的信息和示例(請注意,還有一些有時是明顯不正確的somtimes內容!)為了方便起見,我在此處復制了相關部分:

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

named_function('strlen','new_strlen');

override_function('strlen','$ string','returnoverride_strlen($ string);');

函數override_strlen($ string){返回new_strlen($ string);}

或者您可以將代碼放在命名空間中:

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

http://php.net/namespaces

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM