Domanda

Ho un paio di funzioni all'interno di una classe che essenzialmente fanno la stessa cosa:

public function fn_a(){
        return __FUNCTION__;
}
public function fn_b(){
        return __FUNCTION__;
}
public function fn_c(){
        return __FUNCTION__;
}

Ho bisogno che quelle funzioni rimangano con i loro nomi attuali, quindi l'ho fatto intenzionalmente non Fare:

public function fn_($letter){
        return __FUNCTION__.$letter;
}

Speravo in una sorta di modo per ridurre al minimo la verbosità del codice qui, dal momento che fanno tutti la stessa cosa.La situazione finale sarebbe qualcosa del genere:

public functions fn_a, fn_b, fn_c() {
      return __FUNCTION__;
}

Un'altra soluzione, se applicabile, potrebbe essere quella di fare qualcosa come "extends" di Class:fn_b, fn_c extend fn_a?

Cosa ne pensate ragazzi?

È stato utile?

Soluzione

Qualsiasi sintassi come quella che hai suggerito non è possibile:se vuoi più funzioni distinte, devi dichiarare tutte quelle funzioni.

Tuttavia, una possibilità potrebbe essere che le tue funzioni fn_a, fn_b e fn_c siano solo semplici wrapper attorno a uno più complesso:

public function fn_a(){
    return fn_all('a');
}
public function fn_b(){
    return fn_all('b');
}
public function fn_c(){
    return fn_all('c');
}

public function fn_all($name) {
    // a lot of complex stuff here
}

Con quello, a seconda della lunghezza del fn_all funzione, ovviamente, ridurresti la quantità di duplicazione del codice.



Un'altra idea (non sono sicuro di come ciò possa essere fatto con i metodi, quindi lo dimostrerò con le funzioni) sarebbe usare Closures - che significa PHP >= 5.3

L'idea di base è che avresti una prima funzione, che ne restituirebbe un'altra, che legherebbe il parametro passato alla prima:

Innanzitutto la funzione che crea le altre:

function creator($name) {
    return function () use ($name) {
        return $name;
    };
}

E, quindi, otteniamo tre funzioni, utilizzando quella del creatore:

$fn_a = creator('a');
$fn_b = creator('b');
$fn_c = creator('c');

E ora, chiamando queste tre funzioni:

echo $fn_a() . '<br />';
echo $fn_b() . '<br />';
echo $fn_c() . '<br />';

Otteniamo il seguente output:

a
b
c


Non sono mai stato bravo a spiegare come funzionano le funzioni anonime e le chiusure, ma cercare "chiusura" su Google dovrebbe aiutarti a capire;nota che puoi leggere il tutorial sulle chiusure in Javascript:l'idea è esattamente la stessa.

(E, poiché le chiusure sono nuove in PHP - arrivate con PHP 5.3 - non troverai tanti tutorial come per Javascript)

Altri suggerimenti

public function fn_catcher($letter) {
        return __FUNCTION__.$letter;
}

public function __call($name) {
        if (substr($name, 0, 3) == 'fn_')
        {
              return $this->fn_catcher($name);
        }
}

Così?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top