¿Es posible reemplazar (monkeypatch) las funciones de PHP?

Puedes hacer esto en Python, pero ¿es posible en PHP?

>>> def a(): print 1 ... >>> def a(): print 2 ... >>> a() 2 

p.ej:

  Fatal error: Cannot redeclare var_dump() in /tmp/- on line 1 

    Esto es un poco tarde, pero solo quiero señalar que desde PHP 5.3, es posible anular las funciones internas sin usar una extensión de PHP.

    El truco es que puedes redefinir una función interna de PHP dentro de un espacio de nombres. Se basa en la forma en que PHP asigna resolución de nombres para las funciones:

    Dentro del espacio de nombres (por ejemplo, A \ B), las llamadas a funciones no calificadas se resuelven en tiempo de ejecución. Así es como se resuelve una llamada a la función foo ():

    1. Busca una función del espacio de nombres actual: A \ B \ foo ().
    2. Intenta buscar y llamar a la función global foo ()

    No, no es posible hacer esto como es de esperar.

    Del manual :

    PHP no admite la sobrecarga de funciones, ni tampoco es posible definir o redefinir funciones declaradas previamente.

    SIN EMBARGO, puedes usar runkit_function_redefine y sus primos, pero definitivamente no es muy elegante …

    También puede usar create_function para hacer algo como esto:

     < ?php $func = create_function('$a,$b','return $a + $b;'); echo $func(3,5); // 8 $func = create_function('$a,$b','return $a * $b;'); echo $func(3,5); // 15 ?> 

    Al igual que con Runkit, no es muy elegante, pero ofrece el comportamiento que estás buscando.

    Me doy cuenta de que esta pregunta es un poco antigua, pero Patchwork es un proyecto PHP 5.3 lanzado recientemente que admite la redefinición de las funciones definidas por el usuario. Sin embargo, como menciona el autor, deberá recurrir a runkit o php-test-helpers para realizar funciones de núcleo / biblioteca de patch mono.

    Como mencionó jmikola, Patchwork es una buena solución si desea agregar código a una función.

    Aquí hay un artículo sobre cómo funciona: http://phpmyweb.net/2012/04/26/write-an-awesome-plugin-system-in-php/

    Viene con un código de muestra. Creo que la versión de phpmyweb usa un código ligeramente mejor, porque no usa el código eval () ‘d, a diferencia de patchwork. Puede almacenar códigos de operación cuando usa eval ().

    ¡La respuesta aceptada es excelente! Solo agregaré que puede poner sus códigos en los espacios del Namespace y luego se restablece el predeterminado GLOBAL-SPACE.

    algunas otras formas:

    1) rename_function ($ old_name, $ new_name)

    2) override_function ($ old_name, $ parameters, $ new_func)

    y raramente utilizado:

    3) runkit_function_rename (…)

    4) runkit_function_redefine (…)