2010-10-13 101 views
7

我有腳本,其中basename()被使用100-1000s的時間,我只是想,如果我們可以重寫函數而不是將函數名更改爲其他腳本中的其他東西。覆蓋默認的PHP函數

basename()的問題在於它不適用於外語文件的名稱。我發現一個在php網站http://php.net/manual/en/function.override-function.php,但它需要PECL任何其他的選擇?

+4

在相關說明中,如果效果不好,請在http://bugs.php.net/ – Artefacto 2010-10-14 01:13:25

+0

@Artefacto上提交錯誤報告,有時由於向後兼容問題,他們不能僅僅更改它。 – Pacerier 2014-10-20 16:22:59

回答

7

您可以使用命名空間來覆蓋現有的函數名稱:

namespace blarg; 
function basename() { 
    return 'whatever'; 
} 
$base = basename(); 

即,基本名稱的任何呼叫()在blarg命名空間內將使用你的新版本的函數。

+3

請記住,只有PHP 5.3及更高版本才支持名稱空間。 – BoltClock 2010-10-13 21:11:12

+0

嘗試以其他方式覆蓋某個功能將導致「功能已存在」錯誤。缺少5.3:創建一個函數'xbasename()',它封裝了真正的基本名稱函數以及處理非ansi字符的另一種方法。然後,CTRL-A和CTRL-H ......我相信每個人都知道其餘的。 – 2010-10-18 20:23:24

+0

有時重寫實現需要調用原始函數。在這個例子中,有沒有辦法從新的基本名稱中調用原始基本名稱? – 2011-06-22 13:23:22

1

你可以調用基名之前更改地區:

setlocale(LC_ALL, 'en_US.UTF8'); 

setlocale

2

另一種方法是runkit。但這在大多數服務器上不太可能啓用。