2009-12-03 13 views
18

Quiero reescribir una función en PHP (digamos la función mail()), y quiero que así sea cuando llame a mail() a partir de ahora, cargue mi versión de mail() y no la predeterminada php versión. ¿Es esto posible en php?¿Es posible reemplazar una función en php (como correo) y hacer que haga otra cosa?

La razón por la que quiero hacer esto es porque tengo miles de líneas de código que llaman mail() y no quiero reescribirlas todas.

También para referencia futura, en programación de computadoras, ¿cómo se llama cuando haces algo como esto?

Gracias

+1

Python es muy bueno en esto, para tu información. PHP no es. – gahooa

+14

@gahooa Está tratando de evitar el código de refactorización, dudo que vaya a reescribirlo todo en Python para facilitar la refactorización. –

+3

posible duplicado de [¿Es posible reemplazar (monopatch) funciones de PHP?] (Http://stackoverflow.com/questions/530649/is-it-possible-to-replace-monkeypatch-php-functions) – outis

Respuesta

19

Hay una extensión que le permite anular funciones. Está destinado a ser utilizado para la depuración, pero supongo que puede usarlo para sus necesidades. Echar un vistazo:

http://www.php.net/manual/en/function.override-function.php

Si desea llamar a la función original dentro de su versión, asegúrese de leer este comentario: http://no.php.net/manual/en/function.override-function.php#50821

+2

Esto parece más fácil de hacer que el runkit. –

+0

gracias. usted sabe el lenguaje php muy bien. – chris

2

Se llama sobrecarga de funciones y no es posible en nativa de PHP, pero es posible el uso de las extensiones descritas en las otras respuestas. La documentación de PHP afirma que no es posible en absoluto: source que es incorrecta.

+0

-1 La referencia es incorrecta. Necesita ser editado. –

+0

@ewan A mitad de camino de la página, "PHP no admite la sobrecarga de funciones, ni tampoco es posible definir o redefinir funciones declaradas previamente". –

+0

Tim. Correcto, ese es el bit que necesita ser editado. Vea la respuesta de Milan y la suya. –

9

Lo que te refieres generalmente se llama method overloading.

Aunque no es soportado por PHP, en realidad se puede ser capaz de redefinir funciones internas (así como las funciones de usuario) utilizando runkit_function_remove() o runkit_function_redefine(). Por supuesto, para usar eso, necesitarás tener el control total sobre la instalación de PHP, ya que no está incluido con PHP, necesitarás install the runkit extension.

Una vez más, en unos normales funciones internas situación, así como funciones de usuario no se puede redefinir (o sobrecargado) en PHP. Esta situación ilustra el beneficio de envolver algunas funciones internas con una función de usuario.

+0

lección aprendida. ¿Sabes si hay una razón por la cual php no se sobrecarga? Parece una herramienta útil. – chris

+0

+1 para runkit sobre APD. APD parecía mucho más torpe (tienes que hacer un par de hacks si quieres llamar a la función anterior de la sobrecarga, o si quieres parchar más de una función) - y parecía que APD estropea el código de salida del proceso de php, lo que significa que causa fallas de compilación en la situación que desee usar (anulando cosas como mt_rand() y time() en un caso de prueba de phpunit que se ejecuta en, por ejemplo, Ant from Jenkins). https://github.com/zenovich/runkit es una actualización para versiones PHP más recientes. –

+3

@Tim, no está sobrecargando. Es primordial. – Pacerier

0

Puede usar expresiones regulares para reemplazar el nombre de la función en sus archivos. La aplicación que utilizas depende de ti, pero te recomendaría la costosa Powergrep (a menos que no la necesites de nuevo).

reemplazar

(\s+)mail([\s(]+) 

a

$1new_function_name$2 

y

^mail([\s(]+) 

a

new_function_name$1 

S orry para mi regexp-fu, no sé cómo buscar espacios o comienzo de línea en una expresión.

+0

Creo que esto obtendrá la mayoría de ellos '(^ | \ t | \ s | \ {) mail \ s * \ ((. *?) \)' Eso coincidirá al comienzo de la línea, una pestaña o un espacio o una llave de apertura si está ajustado a un bloque de código. Tendrá que volver a agregar el espacio al nuevo nombre de la función en el reemplazo. Además, si los bloques de código comienzan con algo que no sea una llave de apertura {deberá reemplazarlo en la coincidencia de expresiones regulares. –

+0

@nickfox: los que escribí son los que utilicé en una fuente de producción extremadamente desordenada, por lo que se prueban sobre el terreno y no se basan en suposiciones. – raveren

+0

@Raveren, Esto parece evitar la pregunta en lugar de responderla. – Pacerier

Cuestiones relacionadas