2012-09-25 41 views
5

Cuando hay una función que requiere una serie de parámetros para ser pasado, tal como siete parámetros, que es la mejor práctica:¿Pasar una matriz de parámetros vs. parámetros individuales a una función en PHP?

function foo($par1, $par2, $par3, $par4, $par5, $par6, $par7) 
{ 
} 

o

function foo(array $args) 
{ 
} 

Cuando en el segundo ejemplo $args haría una matriz con los parámetros como elementos.

He estado utilizando ambos métodos de forma incoherente.

La desventaja de utilizar el primer método es que si obtiene el orden de un parámetro incorrecto, está jodido (y podría ser muy difícil de depurar porque no siempre es obvio). Esta es la ventaja de usar el método de matriz.

La ventaja (en mi humilde opinión) de usar el primer tipo es que un buen editor PHP como PhpStorm le mostrará los nombres de los parámetros mientras escribe la función, lo que es más fácil que ir a la función para ver qué parámetros necesita ser pasado en una matriz.

Agradecemos su consejo.

+0

lo que siempre funciona para usted en el contexto del proyecto. –

+0

Si tiene una función con 7 parámetros, probablemente tenga demasiadas responsabilidades. –

Respuesta

4

Teóricamente, cada parámetro debe abarcar un todo lógico. Las colecciones están destinadas a representar una colección de valores, no un agregado de parámetros de método; los parámetros individuales deben pasarse por separado para indicar claramente el propósito del método.

Prácticamente, cuando pasa parámetros en una matriz, tiene que hacer un montón de comprobaciones manuales para asegurarse de que se han pasado los parámetros correctos. Puede evitar prácticamente cualquier ambigüedad al dar a sus parámetros nombres claros y lógicos (y caracteres de tipografía cuando sea posible). Además, como ya se comentó un comentario, si un método tiene 7 parámetros, probablemente esté listo para algunas refactorizaciones.

Editar: si su método/función hace aceptar un conjunto de vaga definición de "opciones" que afectan a lo que hace el código sólo de una manera menor, considere el uso del componente Symfony OptionsResolver, para facilitar en gran medida la validación de sus opciones formación.

0

Si tiene muchas opciones basadas en argumentos o desea más flexibilidad, intente func_get_args().

function foo() 
{ 
    $arg_list = func_get_args(); 
    for ($i = 0; $i < $numargs; $i++) { 
     echo "Argument $i is: " . $arg_list[$i] . "<br />\n"; 
    } 
} 

Si desea limitar los argumentos aceptables, entonces la mejor definición de variables.

1

Creo que esta pregunta se reduce a "¿Qué tan fuerte es php?" o "¿Qué tan fuerte es el tipo de letra que quiero que sean mis cosas?"

Obviamente, la matriz es la más débilmente acoplada. La cantidad de variables y sus nombres se completa con la persona que llama.

Su llamada con los parámetros separados es un poco más fuerte acoplado, por lo que debe haber al menos un número de parámetros proporcionados.

En mi humilde opinión, olvidaste un tipo de llamada, y eso es con type hinting. Esa es la forma más fuerte de mecanografía fuerte que php, en este momento, proporciona.

ejemplo:

function foo(\MyNamespace\MyObject $par1, \YourNamespace\YourObject $par2) 
{ 
} 

Mi opinión: con mi formación en idiomas sólo mecanografiadas fuerte, prefiero fuerte mecanografiado typed hinting. Hay rumores de que php 5.5 o php 6 también admitirán escalares como una pista de tipo.

Cuestiones relacionadas