referencia por pasar parametros funciones php arguments default

pasar - parametros por referencia php



Usar argumentos predeterminados en una funciĆ³n (9)

Estoy confundido acerca de los valores predeterminados para las funciones de PHP. Digamos que tengo una función como esta:

function foo($blah, $x = "some value", $y = "some other value") { // code here! }

¿Qué sucede si quiero usar el argumento predeterminado para $ x y establecer un argumento diferente para $ y?

He estado experimentando de diferentes maneras y cada vez estoy más confundido. Por ejemplo, probé estos dos:

foo("blah", null, "test"); foo("blah", "", "test");

Pero ninguno de los dos da como resultado un argumento predeterminado adecuado para $ x. También he intentado configurarlo por nombre de variable.

foo("blah", $x, $y = "test");

Esperaba que algo así funcionara. Pero no funciona como esperaba. Parece que no importa lo que haga, voy a tener que terminar escribiendo los argumentos predeterminados de todos modos, cada vez que invoco la función. Y debo estar perdiendo algo obvio.


En este caso, cuando los objetos son mejores, porque puede configurar su objeto para que contenga xey, configure los valores predeterminados, etc.

El enfoque con matriz está cerca de crear el objeto (de hecho, el objeto es un conjunto de parámetros y funciones que funcionarán sobre el objeto, y la función que toma la matriz funcionará sobre algunos parámetros del grupo ov).

Cerainly siempre puedes hacer algunos trucos para establecer null o algo así como por defecto


En realidad es posible:

foo( ''blah'', (new ReflectionFunction(''foo''))->getParameters()[1]->getDefaultValue(), ''test'');

Si quieres hacerlo, es otra historia :)

ACTUALIZAR:

Las razones para evitar esta solución son:

  • es (discutiblemente) feo
  • tiene una sobrecarga obvia.
  • como el otro responde la prueba, hay alternativas

Pero en realidad puede ser útil en situaciones en las que:

  • usted no quiere / no puede cambiar la función original.
  • podrías cambiar la función pero:

    • usar null (o equivalente) no es una opción (ver el comment de DiegoDD)
    • no desea ir con un asociativo o con func_num_args()
    • tu vida depende de guardar un par de LOC

Sobre el rendimiento, una prueba muy simple muestra que el uso de Reflection API para obtener los parámetros predeterminados hace que la llamada de función sea 25 veces más lenta , mientras que todavía requiere menos de un microsegundo . Debes saber si puedes vivir con eso.

Por supuesto, si quiere usarlo en un bucle, debería obtener el valor predeterminado de antemano.


Hace poco tuve este problema y encontré esta pregunta y respuestas. Si bien las preguntas anteriores funcionan, el problema es que no muestran los valores predeterminados a los IDEs que lo soportan (como PHPStorm).

si usa null , no sabrá cuál sería el valor si lo deja en blanco.

La solución que prefiero es poner el valor predeterminado en la definición de la función también:

protected function baseItemQuery(BoolQuery $boolQuery, $limit=1000, $sort = [], $offset = 0, $remove_dead=true) { if ($limit===null) $limit =1000; if ($sort===null) $sort = []; if ($offset===null) $offset = 0; ...

La única diferencia es que necesito asegurarme de que son iguales, pero creo que es un precio pequeño a pagar por la claridad adicional.


La única manera que conozco de hacerlo es omitiendo el parámetro. La única forma de omitir el parámetro es reorganizar la lista de parámetros para que el que desea omitir esté después de los parámetros que TIENE que establecer. Por ejemplo:

function foo($blah, $y = "some other value", $x = "some value")

Entonces puedes llamar a foo como:

foo("blah", "test");

Esto dará como resultado:

$blah = "blah"; $y = "test"; $x = "some value";


Los argumentos opcionales solo funcionan al final de una llamada de función. No hay forma de especificar un valor para $ y en su función sin especificar también $ x. Algunos idiomas admiten esto a través de parámetros nombrados (VB / C # por ejemplo), pero no PHP.

Puede emular esto si usa una matriz asociativa para parámetros en lugar de argumentos, es decir,

function foo(array $args = array()) { $x = !isset($args[''x'']) ? ''default x value'' : $args[''x'']; $y = !isset($args[''y'']) ? ''default y value'' : $args[''y'']; ... }

Luego llame a la función de esta manera:

foo(array(''y'' => ''my value''));


No se puede hacer esto directamente, pero un pequeño toque de código hace posible emular.

function foo($blah, $x = false, $y = false) { if (!$x) $x = "some value"; if (!$y) $y = "some other value"; // code }


Propondría cambiar la declaración de función de la siguiente manera para que pueda hacer lo que quiera:

function foo($blah, $x = null, $y = null) { if (null === $x) { $x = "some value"; } if (null === $y) { $y = "some other value"; } code here! }

De esta forma, puedes hacer una llamada como foo(''blah'', null, ''non-default y value''); y haz que funcione como quieras, donde el segundo parámetro $x todavía obtiene su valor predeterminado.

Con este método, pasar un valor nulo significa que desea el valor predeterminado para un parámetro cuando desea anular el valor predeterminado para un parámetro que viene después.

Como se indica en otras respuestas,

los parámetros predeterminados solo funcionan como los últimos argumentos de la función. Si desea declarar los valores predeterminados en la definición de función, no hay forma de omitir un parámetro y anular uno que lo sigue.

Si tengo un método que puede aceptar números variables de parámetros y parámetros de distintos tipos, a menudo declaro que la función es similar a la respuesta mostrada por Ryan P.

Aquí hay otro ejemplo (esto no responde a su pregunta, pero con suerte es informativo:

public function __construct($params = null) { if ($params instanceof SOMETHING) { // single parameter, of object type SOMETHING } else if (is_string($params)) { // single argument given as string } else if (is_array($params)) { // params could be an array of properties like array(''x'' => ''x1'', ''y'' => ''y1'') } else if (func_num_args() == 3) { $args = func_get_args(); // 3 parameters passed } else if (func_num_args() == 5) { $args = func_get_args(); // 5 parameters passed } else { throw new InvalidArgumentException("Could not figure out parameters!"); } }


También puedes verificar si tienes una cadena vacía como argumento para que puedas llamar como:

foo(''blah'', "", ''non-default y value'', null);

Debajo de la función:

function foo($blah, $x = null, $y = null, $z = null) { if (null === $x || "" === $x) { $x = "some value"; } if (null === $y || "" === $y) { $y = "some other value"; } if (null === $z || "" === $z) { $z = "some other value"; } code here! }

No importa si completa null o "" , aún obtendrá el mismo resultado.


function image(array $img) { $defaults = array( ''src'' => ''cow.png'', ''alt'' => ''milk factory'', ''height'' => 100, ''width'' => 50 ); $img = array_merge($defaults, $img); /* ... */ }