Redeclare function (override) [cerrado]

2

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

por ejemplo, ya está declarado:

function smth(){
echo 'aaa';
}

y quiero que se muestre no aaa , sino bbb

function smth(){
echo 'bbb';
}

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

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



ACTUALIZACIÓN - He encontrado una solución:

enlace

    
pregunta T.Todua 29.01.2014 - 21:47

3 respuestas

3

PHP no puede volver a declarar funciones. Deberá utilizar algún otro enfoque, como filtros o similar.

    
respondido por el Otto 29.01.2014 - 22:07
3

PHP no permite redeclar funciones. Si escribe la función original, hay muchas maneras de permitirle escribir funciones más flexibles.

Los condicionales a los argumentos pasados y el filtro enganche son los primeros que me vienen a la mente.

EX. 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');

EX. 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 es no suya y no proporciona ningún filtro para cambiar la salida y absolutamente necesita cambiar el comportamiento de esa función, entonces mire Patchwork , una biblioteca de PHP que le permite redefinir las funciones definidas por el usuario en tiempo de ejecución. Sin embargo, use Patchwork con precaución y solo si es absolutamente necesario, porque Patchwork está diseñado para ser utilizado con fines de prueba, no en producción.

    
respondido por el gmazzap 30.01.2014 - 00:15
1

Yo sugeriría usar un enfoque de POO, como:

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

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

$a = new SomeClass();
$a->aa(); // outputs aa
$b = new SomeOtherClass();
$b->aa(); // outputs bb
    
respondido por el Eriks Klotins 30.01.2014 - 10:43

Lea otras preguntas en las etiquetas