Redeclarar función (sobreescribir)

29 ene 2014, 22:47:40
Vistas: 26.1K
Votos: 3

¿Cuál es el mejor método para cambiar una función previamente declarada por una nueva?

por ejemplo, ya existe declarada:

function smth(){
echo 'aaa';
}

y quiero que muestre no aaa, sino bbb

function smth(){
echo 'bbb';
}

pero cuando inserto la nueva función (dentro de functions.php), obtengo un mensaje de error

(Fatal error: Cannot redeclare **smth()** (previously declared in ... )



ACTUALIZACIÓN - He encontrado una solución:

https://stackoverflow.com/a/8125517/2165415

0
Todas las respuestas a la pregunta 3
0

PHP no puede redeclarar funciones. Necesitarás usar algún otro enfoque, como filtros o similar.

29 ene 2014 23:07:00
0

PHP no permite redeclarar funciones. Si escribes la función original, hay muchas formas que te permiten escribir funciones más flexibles.

Condicionales según los argumentos pasados y los hooks de filtro, son los primeros que me vienen a la mente.

EJ. 1:

function smth( $out = 'a' ){
  if ( $out === 'a' ) {
    echo 'aaa';
  } else {
    echo 'bbb';
  }
}

Después de eso, primera llamada

smth();

y segunda vez:

smth('b');

EJ. 2

function smth(){
  echo apply_filters('my_smth_filter', 'aaa');
}

Después de eso, primera llamada

smth();

y segunda vez:

add_filter('my_smth_filter', function() {
  return 'bbb';
});
smth();

Si la función original no es tuya y no proporciona ningún filtro para cambiar la salida y absolutamente necesitas cambiar el comportamiento de esa función, entonces mira Patchwork, una biblioteca de PHP que te permite redefinir funciones definidas por el usuario en tiempo de ejecución. Sin embargo, usa Patchwork con precaución y solo si es absolutamente necesario, porque Patchwork está destinado a usarse con fines de prueba, no en producción.

30 ene 2014 01:15:44
0

Sugeriría usar un enfoque de POO (Programación Orientada a Objetos), como:

class SomeClass
{
  public function aa()
  {
     echo 'aa';
  }
}

class SomeOtherClass extends SomeClass
{
   public function aa()
   {
      return 'bb';
   }
}

$a = new SomeClass();
$a->aa(); // muestra aa
$b = new SomeOtherClass();
$b->aa(); // muestra bb
30 ene 2014 11:43:07