De acuerdo, olvidé por completo cómo omitir argumentos en PHP.
Digamos que tengo:
function getData($name, $limit = '50', $page = '1') {
...
}
¿Cómo llamaría a esta función para que el parámetro del medio tome el valor predeterminado (es decir, '50')?
getData('some name', '', '23');
¿Sería correcto lo anterior? Parece que no puedo hacer que esto funcione.
php
function
parameters
default-value
optional-parameters
Chuck Le Butt
fuente
fuente
ReflectionFunction
. Publiqué esa respuesta en una pregunta similar.Respuestas:
Tu publicación es correcta.
Desafortunadamente, si necesita usar un parámetro opcional al final de la lista de parámetros, debe especificar todo hasta el último parámetro. En general, si desea mezclar y combinar, les da valores predeterminados de
''
onull
y no los use dentro de la función si son ese valor predeterminado.fuente
$limit = is_numeric($limit) ? $limit : '50';
al comienzo de getData funciónNo hay forma de "omitir" un argumento que no sea especificar un me gusta
false
onull
.Dado que PHP carece de algo de azúcar sintáctico cuando se trata de esto, a menudo verá algo como esto:
Lo cual, como se dijo elocuentemente en los comentarios, está usando matrices para emular argumentos con nombre.
Esto proporciona la máxima flexibilidad, pero puede que no sea necesario en algunos casos. Como mínimo, puede mover lo que crea que no se espera la mayor parte del tiempo al final de la lista de argumentos.
fuente
No, no es posible omitir argumentos de esta manera. Puede omitir el paso de argumentos solo si están al final de la lista de parámetros.
Hubo una propuesta oficial para esto: https://wiki.php.net/rfc/skipparams , que fue rechazada. La página de la propuesta enlaza con otras preguntas de SO sobre este tema.
fuente
Nada ha cambiado con respecto a poder omitir argumentos opcionales, sin embargo, para una sintaxis correcta y poder especificar NULL para los argumentos que quiero omitir, así es como lo haría:
Esto se puede llamar así:
getData('some name',NULL,'23');
y cualquiera que llame a la función en el futuro no necesita recordar los valores predeterminados cada vez o la constante declarada para ellos.fuente
La respuesta simple es no . Pero, ¿por qué saltarse cuando reorganizar los argumentos logra esto?
El suyo es un " Uso incorrecto de los argumentos de función predeterminados " y no funcionará como espera.
Una nota al margen de la documentación de PHP:
Considera lo siguiente:
La salida será:
El uso correcto de los argumentos de la función predeterminada debería ser así:
La salida será:
Poner el valor predeterminado a su derecha después de los valores no predeterminados asegura que siempre devolverá el valor predeterminado para esa variable si no está definido / dado Aquí hay un enlace para referencia y de dónde provienen esos ejemplos.
Editar: configurarlo
null
como otros sugieren podría funcionar y es otra alternativa, pero es posible que no se adapte a lo que desea. Siempre establecerá el valor predeterminado en nulo si no está definido.fuente
Para cualquier parámetro omitido (debe hacerlo), vaya con el parámetro predeterminado, para estar seguro.
(Establecer un valor nulo donde el parámetro predeterminado es '' o similar o viceversa lo meterá en problemas ...)
fuente
Como se mencionó anteriormente, no podrá omitir parámetros. Escribí esta respuesta para proporcionar un apéndice, que era demasiado grande para incluirlo en un comentario.
@Frank Nocke propone llamar a la función con sus parámetros predeterminados, por ejemplo, tener
Deberías usar
que funcionalmente será lo mismo que omitir los dos primeros (
$b
y$c
) parámetros.No está claro cuáles son los predeterminados (se
0
escribe para proporcionar un valor predeterminado, ¿o es importante?).También existe el peligro de que el problema de valores predeterminados esté conectado a una función externa (o incorporada), cuando el autor de la función (o método) podría cambiar los valores predeterminados. Entonces, si no cambia su llamada en el programa, podría cambiar involuntariamente su comportamiento.
Una solución podría ser definir algunas constantes globales, como las
DEFAULT_A_B
que serían "valor predeterminado del parámetro B de la función A" y "omitir" parámetros de esta manera:Para las clases, es más fácil y elegante definir las constantes de clase, porque son parte del alcance global, por ejemplo.
Tenga en cuenta que esta constante predeterminada se define exactamente una vez en todo el código (no hay ningún valor incluso en la declaración del método), por lo que en caso de algunos cambios inesperados, siempre proporcionará la función / método con el valor predeterminado correcto.
La claridad de esta solución es, por supuesto, mejor que proporcionar valores predeterminados sin procesar (como
NULL
,0
etc.) que no le dicen nada al lector.(Estoy de acuerdo en que llamar como
$var = a(,,'ddd');
sería la mejor opción)fuente
No puede omitir argumentos, pero puede usar parámetros de matriz y debe definir solo 1 parámetro, que es una matriz de parámetros.
Y puede agregar tantos parámetros como necesite, no es necesario que los defina. Cuando llamas a la función, pones tus parámetros así:
fuente
Bueno, como todos los demás ya han dicho, lo que quieres no será posible en PHP sin agregar líneas de código en la función.
Pero puede colocar este fragmento de código en la parte superior de una función para obtener su funcionalidad:
Básicamente
debug_backtrace()
, obtengo el nombre de la función en la que se coloca este código, para luego crear un nuevoReflectionFunction
objeto y recorrer todos los argumentos de la función.En el ciclo, simplemente verifico si el argumento de la función es
empty()
Y el argumento es "opcional" (significa que tiene un valor predeterminado). Si es así, simplemente asigno el valor predeterminado al argumento.Demo
fuente
Establecer el límite en nulo
y llamar a esa función
si desea establecer el límite, puede pasar como argumento
fuente
Como se aconsejó anteriormente , nada cambió. Sin embargo, tenga cuidado, demasiados parámetros (especialmente los opcionales) son un fuerte indicador del olor del código.
Quizás su función está haciendo demasiado:
Algunos parámetros se podrían agrupar de forma lógica:
En último recurso, siempre puede introducir un objeto de parámetro ad-hoc :
(que es solo una versión glorificada de la técnica de matriz de parámetros menos formal )
A veces, la misma razón para hacer que un parámetro sea opcional es incorrecta. En este ejemplo, ¿
$page
realmente se pretende que sea opcional? ¿Guardar un par de personajes realmente marca la diferencia?fuente
Este fragmento:
La respuesta es :
fuente
Esto es lo que haría:
Espero que esto ayude a alguien
fuente
Esta es una pregunta antigua con una serie de respuestas técnicamente competentes, pero clama por uno de los patrones de diseño modernos en PHP: Programación Orientada a Objetos. En lugar de inyectar una colección de tipos de datos escalares primitivos, considere usar un "objeto inyectado" que contenga todos los datos necesarios para la función. http://php.net/manual/en/language.types.intro.php
El objeto inyectado puede tener rutinas de validación de propiedades, etc. Si la instanciación e inyección de datos en el objeto inyectado no puede pasar toda la validación, el código puede lanzar una excepción inmediatamente y la aplicación puede evitar el incómodo proceso de tratar con datos potencialmente incompletos.
Podemos teclear el objeto inyectado para detectar errores antes de la implementación. Algunas de las ideas se resumen en este artículo de hace unos años.
https://www.experts-exchange.com/articles/18409/Using-Named-Parameters-in-PHP-Function-Calls.html
fuente
Tuve que hacer una fábrica con parámetros opcionales, mi solución fue usar el operador de fusión nula:
Uso:
No es la cosa más bonita, pero podría ser un buen patrón para usar en Factories para pruebas.
fuente
Prueba esto.
fuente
No puede omitir el parámetro medio en su llamada de función. Pero, puedes solucionar esto:
Función:
fuente
Como señaló @IbrahimLawal. Es una buena práctica simplemente establecerlos en
null
valores. Simplemente verifique si el valor pasado esnull
en el que usa sus valores predeterminados definidos.Espero que esto ayude.
fuente
simplemente no los pase y se aceptará el valor predeterminado
fuente