predefinidas parametros otro manejo llamar funciones funcion ejemplos desde array php function redeclaration

parametros - ¿Es posible sobrescribir una función en PHP?



manejo de funciones en php (9)

Parche de mono en el espacio de nombres php> = 5.3

Un método menos evasivo que modificar al intérprete es el parche de mono.

El parche de mono es el arte de reemplazar la implementación real con un "parche" propio similar.

Habilidades Ninja

Antes de que puedas parche de mono como un Ninja de PHP primero tenemos que entender los espacios de nombres de PHP.

Desde PHP 5.3 nos introdujeron a los espacios de nombres que a primera vista podría ser equivalente a algo así como paquetes java, pero no es lo mismo. Namespaces, en PHP, es una forma de encapsular el alcance mediante la creación de una jerarquía de foco, especialmente para funciones y constantes. Como este tema, la reserva para las funciones globales , tiene como objetivo explicar.

Si no proporciona un espacio de nombres cuando llama a una función , PHP primero busca en el espacio de nombres actual y luego baja la jerarquía hasta que encuentra la primera función declarada dentro de ese espacio de nombres prefijado y lo ejecuta. Para nuestro ejemplo, si llama a print_r(); desde el namespace My/Awesome/Namespace; de namespace My/Awesome/Namespace; Lo que PHP hace es buscar primero una función llamada My/Awesome/Namespace/print_r(); luego My/Awesome/print_r(); luego My/print_r(); hasta que encuentre la función PHP incorporada en el espacio de nombres global /print_r(); .

No podrá definir una function print_r($object) {} en el espacio de nombres global porque esto causará una colisión de nombre ya que una función con ese nombre ya existe.

Esperar un error fatal a los gustos de:

Fatal error: Cannot redeclare print_r()

Pero nada lo detiene, sin embargo, de hacer justamente eso dentro del alcance de un espacio de nombres.

Parcheando el mono

Supongamos que tiene un script que usa varios print_r(); llamadas.

Ejemplo:

<?php print_r($some_object); // do some stuff print_r($another_object); // do some other stuff print_r($data_object); // do more stuff print_r($debug_object);

Pero luego cambias de opinión y quieres que la salida se ajuste a <pre></pre> etiquetas <pre></pre> lugar. ¿Alguna vez te ha pasado?

Antes de ir y cambiar cada llamada a print_r(); considere el parche de mono en su lugar.

Ejemplo:

<?php namespace MyNamespace { function print_r($object) { echo "<pre>", /print_r($object, true), "</pre>"; } print_r($some_object); // do some stuff print_r($another_object); // do some other stuff print_r($data_object); // do more stuff print_r($debug_object); }

Su script ahora usará MyNamespace/print_r(); en lugar del global /print_r();

Funciona muy bien para burlarse de las pruebas unitarias.

nJoy!

¿Puedes declarar una función como esta ...

function ihatefooexamples(){ return "boo-foo!"; };

Y luego redeclararlo algo así ...

if ($_GET[''foolevel''] == 10){ function ihatefooexamples(){ return "really boo-foo"; }; };

¿Es posible sobrescribir una función de esa manera?

¿De todas formas?


Editar

Para abordar los comentarios, esta respuesta no aborda directamente la pregunta original. Si llegó aquí desde una Búsqueda de Google, comience aquí

Hay una función disponible llamada override_function que realmente se ajusta a la factura. Sin embargo, dado que esta función es parte de la extensión de Advanced PHP Debugger , es difícil argumentar que override_function() está destinado para uso en producción. Por lo tanto, diría "No", no es posible sobrescribir una función con la intención que el interlocutor original tenía en mente.

Respuesta original

Aquí es donde debe aprovechar OOP, específicamente el polimorfismo.

interface Fooable { public function ihatefooexamples(); } class Foo implements Fooable { public function ihatefooexamples() { return "boo-foo!"; } } class FooBar implements Fooable { public function ihatefooexamples() { return "really boo-foo"; } } $foo = new Foo(); if (10 == $_GET[''foolevel'']) { $foo = new FooBar(); } echo $foo->ihatefooexamples();


Dependiendo de la situación donde lo necesite, tal vez pueda usar funciones anónimas como esta:

$greet = function($name) { echo(''Hello '' . $name); }; $greet(''World'');

... luego puede establecer una nueva función para la variable dada en cualquier momento


Eche un vistazo a override_function para anular las funciones.

override_function - Anula las funciones incorporadas

Ejemplo:

override_function(''test'', ''$a,$b'', ''echo "DOING TEST"; return $a * $b;'');


Incluiría todas las funciones de un caso en un archivo de include , y los demás en otro include .

Por ejemplo simple.inc contendría la function boofoo() { simple } y really.inc contendría la function boofoo() { really }

Ayuda a la lectura / mantenimiento de su programa, teniendo todas las funciones del mismo tipo en el mismo inc .

Luego, en la parte superior de tu módulo principal

if ($_GET[''foolevel''] == 10) { include "really.inc"; } else { include "simple.inc"; }


No puede volver a declarar ninguna función en PHP. Sin embargo, puede anularlos. Comprueba las override_function cambio de nombre para guardar la función que estás anulando si lo deseas.

Por lo tanto, tenga en cuenta que cuando anula una función, la pierde. Es posible que desee considerar mantenerlo, pero con un nombre diferente. Solo digo.

Además, si se trata de funciones en clases que desea anular, solo necesita crear una subclase y redeclarar la función en su clase sin tener que renombrar la función y anular la función.

Ejemplo:

rename_function(''mysql_connect'', ''original_mysql_connect'' ); override_function(''mysql_connect'', ''$a,$b'', ''echo "DOING MY FUNCTION INSTEAD"; return $a * $b;'');



Podría usar la extensión PECL

pero esa es una mala práctica en mi opinión. Está utilizando funciones, pero revise el patrón de diseño del Decorador . Puede tomar prestada la idea básica de ella.


la respuesta corta es no, no puede sobreescribir una función una vez que esté en el alcance de la función de PHP.

su mejor uso de funciones anónimas como tal

$ihatefooexamples = function() { return "boo-foo!"; } //... unset($ihatefooexamples); $ihatefooexamples = function() { return "really boo-foo"; }

http://php.net/manual/en/functions.anonymous.php