2010-10-13 2 views
7

У меня есть сценарий, где basename() используется 100-1000s времени, я просто думаю, если мы можем переопределить функцию, а не изменять имя функции к чему-то еще во всех сценариях.Override функция PHP по умолчанию

Проблема basename() в том, что оно не работает хорошо с именами файлов на иностранных языках. Я нашел на PHP сайте http://php.net/manual/en/function.override-function.php но она нуждается в PECL любой другой альтернативы?

+4

Относительно примечания, если это не сработало, отправьте отчет об ошибке в http://bugs.php.net/ – Artefacto

+0

@Artefacto. Иногда они не могут просто изменить его из-за проблем с обратной совместимостью. – Pacerier

ответ

7

Вы можете использовать пространство имена, чтобы переопределить существующие имена функций:

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

То есть, любой вызов базовых() в пространстве имен blarg будет использоваться ваша новая версия функции.

+3

Помните, что пространства имен поддерживаются только в PHP 5.3 и более поздних версиях. – BoltClock

+0

Попытка иначе переопределить функцию приведет к ошибке «функция уже существует». Недостаток 5.3: создать функцию 'xbasename()', которая инкапсулирует истинную функцию базового имени вместе с другим методом обработки символов, отличных от ansi. Затем CTRL-A & CTRL-H ... Я уверен, что все знают все остальное. –

+0

иногда переопределять реализацию нужно вызвать оригинальную функцию. В этом примере есть способ вызвать исходное базовое имя из нового базового имени? –

1

Вы можете изменить локаль перед вызовом базового имени:

setlocale(LC_ALL, 'en_US.UTF8'); 

setlocale

2

Альтернативой будет runkit. Но это вряд ли будет включено на большинстве серверов.