2010-10-13 100 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。但这在大多数服务器上不太可能启用。