Escribí una función PHP que puede aceptar 10 parámetros, pero solo se requieren 2. A veces, quiero definir el octavo parámetro, pero no quiero escribir cadenas vacías para cada uno de los parámetros hasta que llegue al octavo.
Una idea que tuve fue pasar una función abstraída con una matriz de parámetros que la pasa junto a la función real.
¿Existe una mejor manera de configurar la función para que pueda pasar solo los parámetros que quiero?
php
function
parameter-passing
user481826
fuente
fuente
Respuestas:
Haga que la función tome un parámetro: una matriz. Pase los parámetros reales como valores en la matriz.
Editar: el enlace en el comentario de Pekka casi lo resume.
fuente
Lo que he hecho en este caso es pasar una matriz, donde la clave es el nombre del parámetro y el valor es el valor.
fuente
Para lograr lo que desea, use una matriz como dijo Rabbot (aunque esto puede convertirse en una molestia para documentar / mantener si se usa en exceso). O simplemente use los argumentos opcionales tradicionales.
Sin embargo, generalmente encuentro que cuando comienzo a escribir una función / método con tantos argumentos, la mayoría de las veces es un olor a código y se puede refactorizar / abstraer en algo mucho más limpio.
fuente
En PHP 5.6 y posterior, las listas de argumentos pueden incluir el símbolo ... para indicar que la función acepta un número variable de argumentos. Los argumentos se pasarán a la variable dada como una matriz; por ejemplo:
Ejemplo usando ... para acceder a argumentos variables
El ejemplo anterior dará como resultado:
Listas de argumentos de longitud variable Documentación PHP
fuente
Puede establecer el valor predeterminado en nulo.
fuente
null
con los que no sean bits del tipo de fecha. por ejemploarray()
para matricesNOTA: Esta es una respuesta antigua, para PHP 5.5 y versiones anteriores. PHP 5.6+ admite argumentos predeterminados
En PHP 5.5 y versiones anteriores, puede lograr esto utilizando uno de estos 2 métodos:
Cómo utilizar
Prefiero el segundo método porque es limpio y fácil de entender, pero a veces es posible que necesite el primer método.
fuente
$x = null; if ($x) echo "true"; else echo "false";
imprimirá "falso", incluso si $ x var tiene un valor ("nulo" en este código). Además, en ambos métodos estamos usando el operador ternario, por lo que es correcto usar solo un "=". Si prueba conmethod(); method(1); method(1, 2);
, la primera llamada asociará arg1 y arg2 con los valores predeterminados, la segunda llamada asociará el segundo arg con el valor predeterminado y "1" para el primer argumento. La última llamada no asociará valores predeterminados.Creo que también puedes usar objetos como params-transportes.
Por supuesto, debe establecer valores predeterminados para "optParam8" y "optParam2" en esta función, en otro caso obtendrá "Notice: Undefined property: stdClass :: $ optParam2"
Si utilizo matrices como parámetros de función, me gusta de esta manera establecer valores predeterminados:
fuente
Si solo se requieren dos valores para crear el objeto con un estado válido, simplemente puede eliminar todos los demás argumentos opcionales y proporcionarles definidores (a menos que no desee que cambien en tiempo de ejecución). Luego, simplemente cree una instancia del objeto con los dos argumentos requeridos y configure los demás según sea necesario a través del establecedor.
Otras lecturas
fuente
Sé que esta es una publicación antigua, pero estaba teniendo un problema como el OP y esto es lo que se me ocurrió.
Ejemplo de matriz que podría pasar. Puede volver a pedir esto si se requiere un pedido en particular, pero para esta pregunta, esto hará lo que se le pide.
Esto es manejable, fácil de leer y los puntos de extracción de datos se pueden agregar y eliminar en cualquier momento en cualquier lugar de la codificación y aún así evitar una reescritura masiva. Usé claves enteras para coincidir con la pregunta original de OP, pero las claves de cadena se podrían usar con la misma facilidad. De hecho, por legibilidad, lo recomendaría.
Pegue esto en un archivo externo para mayor facilidad
ponga esto al principio si el archivo.
Solo utilícelos para asignar el siguiente fragmento de uso de datos / numeración de acuerdo con el lugar de donde provienen los datos.
Y finalmente pasa la matriz
fuente
Puede hacer una función regular y luego agregar sus variables opcionales dándoles un valor Nulo predeterminado.
Un nulo sigue siendo un valor, si no llama a la función con un valor para esa variable, no estará vacía, por lo que no hay error.
fuente
Si normalmente solo pasa el octavo valor, puede reordenar sus parámetros para que sea el primero. Solo necesita especificar los parámetros hasta el último que desea configurar.
Si está utilizando valores diferentes, tiene 2 opciones.
Una sería crear un conjunto de funciones contenedoras que tomen diferentes parámetros y establezcan los valores predeterminados de los demás. Esto es útil si solo usa algunas combinaciones, pero puede complicarse mucho rápidamente.
La otra opción es pasar una matriz donde las claves son los nombres de los parámetros. Luego, puede verificar si hay un valor en la matriz con una clave y, si no, usar el predeterminado. Pero nuevamente, esto puede complicarse y agregar mucho código extra si tiene muchos parámetros.
fuente
PHP permite argumentos predeterminados ( enlace ). En su caso, podría definir todos los parámetros del 3 al 8 como NULL o como una cadena vacía "" dependiendo de su código de función. De esta manera, puede llamar a la función solo usando los dos primeros parámetros.
Por ejemplo:
fuente
echo " this is arg3: " . $arg3;
, usando , etc., verá que llamar, por ejemplo,yourFunction(3, 2, $arg8=5);
se imprimirá32 this is arg3: 5
. El problema es que la posición del parámetro sigue siendo importante cuando se pasan parámetros opcionales en PHP ... nombres de parámetros no son suficientes para asignar valores de parámetros a nombres de parámetros.Simplemente configure Null para ignorar los parámetros que no desea usar y luego configure el parámetro necesario según la posición.
fuente
fuente
default
es una palabra clave en PHP .