¿Es posible sustituir (monkeypatch) funciones de PHP?
-
22-08-2019 - |
Pregunta
Usted puede hacer esto en Python, pero es posible que en PHP?
>>> def a(): print 1
...
>>> def a(): print 2
...
>>> a()
2
por ejemplo:.
<? function var_dump() {} ?>
Fatal error: Cannot redeclare var_dump() in /tmp/- on line 1
Solución
Este es un bits tarde, pero sólo quiero señalar que a partir de PHP 5.3, en realidad es posible reemplazar las funciones internas sin necesidad de utilizar una extensión de PHP.
El truco es que puede volver a definir una función de PHP interna dentro de un espacio de nombres. Se basa en la forma en PHP hace la resolución de nombres para las funciones:
Dentro de espacio de nombres (digamos A \ B), las llamadas a funciones no cualificadas se resuelven en tiempo de ejecución. Así es como una llamada a la función foo () se resuelve:
- Se busca una función desde el espacio de nombres actual: A \ B \ foo ().
- Se trata de encontrar y llamar a la función foo mundial ()
Otros consejos
No, no es posible hacer esto como se podría esperar.
Desde el manual
:
PHP no soporta la sobrecarga de funciones, ni es posible redefinir u funciones previamente declaradas.
Sin embargo, puede utilizar runkit_function_redefine
y sus primos , pero definitivamente no es muy elegante ...
También puede utilizar create_function
a 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 da el comportamiento que busca.
Me doy cuenta de esta pregunta es un poco viejo, pero remiendo es un recientemente- lanzado PHP 5.3 proyecto que apoya redefinición de las funciones definidas por el usuario. Sin embargo, como el autor menciona, tendrá que recurrir a runkit o -prueba PHP-ayudantes a mono núcleo -patch / funciones de la biblioteca.
Tipo de. Ver http://dev.kafol.net/2008/09 /php-redefining-deleting-adding.html.
Como se mencionó jmikola, remiendo es una buena solución si desea agregar código para una función.
He aquí un artículo acerca de cómo funciona: http://phpmyweb.net/2012/ 04/26 / escritura-un-impresionante-plugin-sistema-en-php /
Viene con un código de ejemplo. Creo que la versión phpmyweb utiliza un código ligeramente mejor, ya que no utiliza eval () 'd code, a diferencia de mosaico. Puede almacenar en caché los códigos de operación al utilizar eval ().
La respuesta aceptada es excelente !!! Me limitaré a añadir que usted puede poner sus códigos en y el valor por defecto GLOBAL-SPACE se resetea.
algunas otras maneras:
1) rename_function ($ nombre_viejo, $ new_name)
2) override_function ($ nombre_viejo, $ parámetros, $ new_func)
y rara vez se utiliza: