Pregunta

Tengo un par de funciones dentro de una clase que esencialmente hacen lo mismo:

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

Necesito esas funciones para permanecer en sus nombres actuales, así que intencionalmente lo hice no hacer:

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

Esperaba algún tipo de forma de minificar la verbosidad del código aquí, ya que todos hacen lo mismo. La situación final sería algo como esto:

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

Otra solución, si corresponde, podría estar haciendo algo como "Extends" de Class:fn_b, fn_c extend fn_a?

¿Qué piensan chicos?

¿Fue útil?

Solución

Cualquier sintaxis como la que sugirió no es posible: si desea varias funciones distintas, debe declarar todas esas funciones.

Aún así, una posibilidad podría ser que sus funciones FN_A, FN_B y FN_C solo sean envueltas simples una más compleja:

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 eso, dependiendo de la longitud del fn_all función, por supuesto, reduciría la cantidad de duplicación de código.



Otra idea (No estoy seguro de cómo se podría hacer esto con los métodos, así que demostraré con funciones) sería usar cierres, lo que significa php> = 5.3

La idea básica es que tendría una primera función, que devolvería otra, lo que uniría el parámetro pasado al primero:

Primero, la función que crea a los demás:

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

Y, entonces, obtengamos tres funciones, usando ese creador uno:

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

Y ahora, llamando a esas tres funciones:

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

Obtenemos la siguiente salida:

a
b
c


Nunca he sido bueno explicar cómo funcionan las funciones y cierres anónimos, pero buscar "cierre" en Google debería ayudarlo a comprender; Tenga en cuenta que puede leer el tutorial sobre los cierres en JavaScript: la idea es exactamente la misma.

(Y, como los cierres son nuevos en PHP, llegó con PHP 5.3, no encontrará tantos tutoriales como para JavaScript)

Otros consejos

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

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

¿Como eso?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top