2010-03-26 7 views
1

J'ai deux ou trois fonctions à l'intérieur d'une classe qui font essentiellement la même chose:php - Puis-je intégrer des fonctions avec le même contenu, des noms différents?

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

je besoin de ces fonctions à rester dans leur nom actuel, donc je intentionnellement ai fait pas faire:

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

J'espérais une sorte de moyen de réduire la verbosité du code ici, car ils font tous la même chose. La situation ultime serait quelque chose comme ceci:

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

Une autre solution, le cas échéant, pourrait faire quelque chose comme « étend » de classe: fn_b, fn_c extend fn_a?

Que pensez-vous les gars?

+0

pouvez-vous s'il vous plaît élaborer sur le but de ces méthodes, parce que tbh, cela n'a pas de sens pour moi. – Gordon

Répondre

2

Toute syntaxe comme celle que vous avez suggérée n'est pas possible: si vous voulez plusieurs fonctions distinctes, vous devez déclarer toutes ces fonctions.

Pourtant, il pourrait être envisagé que vos fn_a, les fonctions de fn_b et fn_c être juste emballages simples arround un plus complexe:

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 
} 

Avec qui, en fonction de la longueur de la fonction fn_all, bien sûr, vous réduisez la quantité de duplication de code.



Une autre idée (ne sais pas comment cela pourrait se faire avec des méthodes, donc je vais démontrer avec des fonctions) serait d'utiliser Closures - ce qui signifie PHP> = 5.3

L'idée de base étant que vous auriez une première fonction, qui en retournerait une autre - qui lierait le paramètre passé au premier:

D'abord, la fonction qui crée le ers:

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

Et puis, nous allons obtenir trois fonctions, en utilisant ce créateur un:

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

Et maintenant, appeler ces trois fonctions:

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

Nous obtenons la sortie suivante :

a 
b 
c 


Je n'ai jamais réussi à expliquer comment fonctionnent les fonctions anonymes et les fermetures - mais la recherche de "fermeture" sur google devrait vous aider à comprendre; Notez que vous pouvez lire le tutoriel sur les fermetures en Javascript: l'idée est exactement la même.

(Et, comme les fermetures sont nouvelles en PHP - est arrivé avec PHP 5.3 - vous ne trouverez pas autant de tutoriels que pour Javascript)

+0

Oui, j'ai anticipé que ce serait un obstacle. Merci pour l'aide, je vais quand même m'en tenir à la duplication =]. – Gal

+0

@Gal: J'ai édité ma réponse pour ajouter quelques trucs sur les fermetures - pas sûr que ça va aider dans votre cas, mais c'est utile de savoir :-) –

+0

Merci beaucoup! Cela aide beaucoup. J'utilise PHP 5 donc je suppose que ce serait une bonne solution. Je vais essayer et voir comment ça se passe. – Gal

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

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

Comme ça?

Questions connexes