2011-02-07 5 views
9

He sido dichosamente inconsciente de la función de php func_get_args(), y ahora que lo he descubierto quiero usarlo en todas partes. ¿Hay alguna limitación de usar func_get_args en comparación con la declaración de argumento explícito en la definición de la función?func_get_args vs argumentos explícitos

+0

No es realmente un problema importante, pero no funciona con la autocompletación de IDE. La mayoría de los IDE analizan los comentarios de PHPDoc para evitarlo. ¿Hay alguna razón por la que no quieras especificar los argumentos? En la mayoría de los casos, realmente no hay ningún beneficio. – simshaun

+1

Sin limitaciones además del sentido común. Utilice esta función cuando el número de argumentos sea desconocido y no lo use cuando los argumentos estén estrictamente definidos. Eso es todo. –

+0

El editor actual que uso es Dreamweaver 8 (¿cuántos de ustedes se encogieron después de leer esto?) Y de todos modos no se completa automáticamente. Pero para mí la mayor ventaja en el uso de func_get_args parece ser que si tengo que volver atrás y rehacer una función para agregar un par de argumentos, hay una buena posibilidad de que no rompa ningún código existente que anteriormente dependiera explícitamente declarado argumentos. –

Respuesta

11

No debe usar func_get_args a menos que realmente lo necesite.

Si define una función para tomar un número específico de argumentos, PHP generará un error si no proporciona suficientes argumentos en el tiempo de la llamada.

Si toma cualquier cantidad de argumentos a través del func_get_args, depende de usted comprobar específicamente que todos los argumentos que espera se hayan transferido a su función.

Del mismo modo, pierde la capacidad de utilizar type hinting, no puede suministrar default values, y se vuelve mucho más difícil saber qué argumentos espera su función de un vistazo.

En resumen, evita que PHP le ayude a detectar errores lógicos (potencialmente difíciles de depurar).

function do_stuff(MyClass tmpValue, array $values, $optional = null) { 
    // This is vastly better... 
} 

function do_stuff() { 
    // ... than this 
} 

Incluso si desea permitir que un número variable de argumentos, se debe especificar explícitamente tantos argumentos como puedas:

/** 
* Add some numbers 
* Takes two or more numbers to add together 
*/ 
function add_numbers($num_1, $num_2 /* ..., $num_N */) { 
    $total = 0; 
    for ($i = 0; $i < func_num_args(); ++$i) 
    $total += func_get_arg($i); 
    return $total; 
} 

add_numbers(1,2); // OK! 
add_numbers(1,2,3); // OK! 
add_numbers(1)  // Error! 
+0

De hecho, puedes hacer lo que siempre puedes establecer como predeterminado si el argumento no está establecido, pero es mucho más feo. –

+1

También me gustaría señalar que usar 'func_get_args' te obliga a verificar explícitamente cada valor requerido, y sería aproximadamente ~ 7 líneas adicionales por función/método. – RobertPitt

+0

@David Administrar sus propios argumentos/verificación de tipos predeterminados no es para nada lo mismo que hacer que PHP lo haga por usted. En este caso, los valores de argumento predeterminados se refieren explícitamente a la función incorporada, no a algo que improvise usted mismo. – meagar

0

creo auto-realización es más difícil si no imposible de hacer por el IDE (aunque podría usar la declaración phpdoc @param)

EDITAR: puede usarlo cuando tiene solo un argumento: una matriz unidimensional, cuyas claves no importan. Entonces se vuelve muy útil.

1
  • Para empezar, creo que tiene un impacto en el rendimiento.
  • Hace que su código sea mucho más difícil de leer y entender.
  • Ninguna alerta de error automática hará que la depuración sea un problema.
+3

El impacto en el rendimiento no es suficiente para ser un dealbreaker, si es que existe. Ciertamente, no debe ser lo primero a considerar. Si los varargs son la herramienta adecuada para el trabajo, úselos. – cHao

+0

Por qué debería usarlo si realmente lo necesita, pero como su método general es una mala idea e incluso si hace caso omiso de los problemas de calidad del código habrá un pequeño golpe de rendimiento, tal vez no es algo que necesite pensar en un solo llame, pero si Every method usa esto, creo que puede sumar, y específicamente pensó en usarlo para todas las llamadas;) –

+0

Además, todos los otros argumentos solo conciernen al desarrollador pero el rendimiento alcanzado, sin importar cuán pequeño sea un hecho absoluto que hace que esta llamada sea al menos un poco peor que una función directa con argumentos fijos :) –

0

La única limitación que conozco es que las cosas son más difíciles de verificar en el tiempo de análisis. Tenga en cuenta que esto incluye analizadores para, por ejemplo, herramientas de documentación automatizadas, ya que las funciones tienen argumentos que no están allí en la declaración de función

Cuestiones relacionadas