Ridichiarare una funzione (override)

29 gen 2014, 22:47:40
Visualizzazioni: 26.1K
Voti: 3

Qual è il metodo migliore per modificare una funzione precedentemente dichiarata in una nuova?

per esempio, c'è già dichiarata:

function smth(){
echo 'aaa';
}

e voglio che visualizzi non aaa, ma bbb

function smth(){
echo 'bbb';
}

ma quando inserisco la nuova funzione (dentro functions.php), ottengo un messaggio di errore

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



AGGIORNAMENTO - Ho trovato una soluzione:

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

0
Tutte le risposte alla domanda 3
0

PHP non può ridefinire funzioni. Sarà necessario utilizzare un altro approccio, come filtri o simili.

29 gen 2014 23:07:00
0

PHP non consente di ridefinire le funzioni. Se scrivi la funzione originale, ci sono molti modi per permetterti di scrivere funzioni più flessibili.

Condizioni basate sugli argomenti passati e gli hook dei filtri sono le prime cose che mi vengono in mente.

ESEMPIO 1:

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

Dopo di che, la prima chiamata

smth();

e la seconda volta:

smth('b');

ESEMPIO 2

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

Dopo di che, la prima chiamata

smth();

e la seconda volta:

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

Se la funzione originale non è una tua funzione e non fornisce alcun filtro per modificare l'output e hai assolutamente bisogno di cambiare il comportamento di quella funzione, allora dai un'occhiata a Patchwork, una libreria PHP che ti permette di ridefinire le funzioni definite dall'utente durante l'esecuzione. Tuttavia, usa Patchwork con cautela e solo se assolutamente necessario, perché Patchwork è pensato per essere utilizzato a scopo di testing, non in produzione.

30 gen 2014 01:15:44
0

Consiglierei di utilizzare un approccio OOP, come:

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

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

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