recibir - PHP: lista de argumentos de longitud variable por referencia?
pasar variables por url php post (5)
Debería poder pasar todos sus parámetros envueltos en un objeto.
Class A
{
public $var = 1;
}
function f($a)
{
$a->var = 2;
}
$o = new A;
printf("/$o->var: %s/n", $o->var);
f($o);
printf("/$o->var: %s/n", $o->var);
debe imprimir 1 2
¿Es posible crear una función de PHP que tome una cantidad variable de parámetros, todos ellos por referencia?
No me ayuda una función que recibe por referencia una matriz de valores ni una función que toma sus argumentos envueltos en un objeto porque estoy trabajando en la composición de la función y el enlace de argumentos. Tampoco pienses en el tiempo de llamada paso por referencia. Esa cosa ni siquiera debería existir.
Edición: lo siento, no vi que querías que fueran referencias ... todo lo que tienes que hacer es pasarlas como un objeto.
También puedes pasarlos en una matriz por ejemplo
myfunction(array(''var1'' => ''value1'', ''var2'' => ''value2''));
entonces en la función simplemente
myfunction ($arguments) {
echo $arguments[''var1''];
echo $arguments[''var2''];
}
Las matrices también se pueden anidar.
Es posible:
$test = ''foo'';
$test2 = ''bar'';
function test(){
$backtrace = debug_backtrace();
foreach($backtrace[0][''args''] as &$arg)
$arg .= ''baz'';
}
test(&$test, &$test2);
Sin embargo, esto utiliza el paso de tiempo de llamada por referencia que está en desuso.
PHP 5.6 introduce una nueva sintaxis variable que soporta paso por referencia. El prefijo del último parámetro a una función con ...
declara como una matriz que mantendrá cualquier argumento real a partir de ese punto. Se puede declarar que la matriz contiene referencias prefijando más el token ...
con un &
, como se hace con otros parámetros, haciendo que los argumentos se pasen por ref.
Ejemplo 1:
function foo(&...$args) {
$args[0] = ''bar'';
}
foo($a);
echo $a, "/n";
# output:
#a
Ejemplo 2:
function number(&...$args) {
foreach ($args as $k => &$v) {
$v = $k;
}
}
number($zero, $one, $two);
echo "$zero, $one, $two/n";
# output:
#0, 1, 2
PHP 5.6 introdujo una nueva sintaxis variable que soporta paso por referencia. (Gracias @outis por la actualización)
function foo(&...$args) {
$args[0] = ''bar'';
}
Para PHP 5.5 o inferior puedes usar el siguiente truco:
function foo(&$param0 = null, &$param1 = null, &$param2 = null, &$param3 = null, &$param4 = null, &$param5 = null) {
$argc = func_num_args();
for ($i = 0; $i < $argc; $i++) {
$name = ''param''.$i;
$params[] = & $$name;
}
// do something
}
El inconveniente es que la cantidad de argumentos está limitada por la cantidad de argumentos definidos (6 en el fragmento de ejemplo). pero con la func_num_args () podría detectar si se necesitan más.
Pasar más de 7 parámetros a una función es una mala práctica de todos modos;)