2010-10-13 16 views
7

Tengo un script en el que basename() se usa 100-1000s de tiempo, solo estaba pensando si podemos anular la función en lugar de cambiar el nombre de la función por otra cosa en todos los scripts.Sobrescribir la función predeterminada de php

El problema con basename() es que no funciona bien con nombres de archivos en idiomas extranjeros. Encontré uno en php sitio http://php.net/manual/en/function.override-function.php pero necesita PECL alguna otra alternativa?

+4

En una nota relacionada, si no funciona bien, envíe un informe de error a http://bugs.php.net/ – Artefacto

+0

@Artefacto, a veces no pueden simplemente cambiarlo debido a problemas de compatibilidad con versiones anteriores. – Pacerier

Respuesta

7

Puede utilizar espacios de nombres para anular los nombres de funciones existentes:

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

decir, cualquier llamada a nombre base() dentro del espacio de nombres blarg usará su nueva versión de la función.

+3

Recuerde que los espacios de nombres solo son compatibles con PHP 5.3 y versiones posteriores. – BoltClock

+0

Si se intenta anular una función de lo contrario, se producirá un error de 'la función ya existe'. Falta 5.3: crea una función 'xbasename()' que encapsula la verdadera función de nombre base junto con otro método para manejar caracteres no ansi. Entonces, CTRL-A y CTRL-H ... Estoy seguro de que todo el mundo sabe el resto. –

+0

a veces anula la implementación necesita llamar a la función original. En este ejemplo, ¿hay alguna manera de llamar al basename original desde el nuevo basename? –

1

Puede cambiar la configuración regional antes de llamar a nombre base:

setlocale(LC_ALL, 'en_US.UTF8'); 

setlocale

2

Una alternativa sería runkit. Pero es poco probable que esté habilitado en la mayoría de los servidores.

Cuestiones relacionadas