2010-02-24 27 views
19

Me gustaría redefinir ciertas funciones en PHP que ya están construidas, por ejemplo, echo() o time() - No necesito definir estas funciones globalmente, solo dentro de un solo script para probar .Redefinir funciones PHP integradas

Creo que esto se puede hacer en Perl pero en PHP - ¿Es esto posible?

+1

posible duplicado de [? ¿Es posible sustituir una función en php (como el correo) y hacer que hacer otra cosa] (http://stackoverflow.com/ questions/1837184/is-it-possible-to-replace-a-function-in-php-such-as-mail-and-make-it-do-someth) – outis

+1

... [¿Es posible reemplazar (monkeypatch) Funciones de PHP?] (Http: // stackoverflow.com/q/530649 /), [Php redefine Class Methods OR Class] (http://stackoverflow.com/q/137006/) – outis

+0

... ¿por qué alguien haría eso? –

Respuesta

17

runkit_function_redefine - Reemplazar una definición de función con una nueva aplicación

Nota: Por defecto, sólo las funciones de espacio de usuario puede ser retirado, cambiado de nombre o modificada. Para anular las funciones internas , debe habilitar la configuración runkit.internal_override en php.ini.

+0

¿Tiene esto un efecto global en todos los scripts de PHP o es específico para un script en particular? – Abs

+0

Depende del alcance del archivo php.ini que está editando. – Dolph

+4

La edición del archivo php.ini afectará a todos los scripts PHP que se ejecutan en esa instalación particular de PHP. La función de redifinición en sí misma, sin embargo, es exclusiva de los scripts que llaman 'runkit_function_redefine()'. –

6

También puede ser que desee comprobar hacia fuera

override_function() - Anula funciones integradas

del paquete Advanced PHP debugger.

Sin embargo, tener que redefinir las funciones nativas de PHP o las declaraciones de idioma debe sonar una alarma. En mi opinión, esto no debería ser parte de su código de producción, a menos que esté escribiendo un depurador o una herramienta similar.

Otra opción sería utilizar http://antecedent.github.io/patchwork

Patchwork es una biblioteca PHP que hace que sea posible redefinir funciones y los métodos definidos por el usuario en tiempo de ejecución, replicando sin apretar la funcionalidad runkit_function_redefine en puro código PHP 5.3, que, entre otras cosas, le permite reemplazar los métodos estáticos y privados con dobles de prueba.

Este último no funciona para las funciones nativas aunque

+0

@Gordon - gracias por la sugerencia. Solo quiero hacer esto con fines de prueba y no de producción: ¡tienes razón, suena la alarma! – Abs

1

echo no es una función, que es una construcción del lenguaje. No tengo nada para eso.

Pero las llamadas a funciones como time() Se pueden anular desde PHP-5.3's namespace fallback policy:

Para las funciones de [...], PHP caerá de nuevo a las funciones globales [...] si una función de espacio de nombres [...] no existe.

E.g. para la función no calificada llame al time() en el espacio de nombres no global foo puede proporcionar foo\time().

Personalmente, estoy usando esto para burlarme, p. time() para prueba unitaria. Publiqué esos simulacros en la biblioteca PHP-Mock:

namespace foo; 

use phpmock\phpunit\PHPMock; 

class FooTest extends \PHPUnit_Framework_TestCase 
{ 

    use PHPMock; 

    public function testBar() 
    { 
     $time = $this->getFunctionMock(__NAMESPACE__, "time"); 
     $time->expects($this->once())->willReturn(3); 
     $this->assertEquals(3, time()); 
    } 
} 
Cuestiones relacionadas