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
¿Fue útil?

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:

  1. Se busca una función desde el espacio de nombres actual: A \ B \ foo ().
  2. 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:

3) runkit_function_rename (...)

4) runkit_function_redefine (...)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top