variable valor una referencia por paso parametros pagina otra llamar globales funciones php function variables arguments pass-by-reference

valor - return php



cómo pasar argumentos ilimitados por referencia en php (8)

Esto funciona:

$test = ''foo''; $test2 = ''bar''; function test(){ $backtrace = debug_backtrace(); foreach($backtrace[0][''args''] as &$arg) $arg .= ''baz''; } test(&$test, &$test2);

Sin embargo, esto utiliza un pase de tiempo de llamada por referencia que está en desuso.

Tengo la función php que tiene un número ilimitado de argumentos que obtengo de func_get_args (). Tengo algunas operaciones con argumentos (cambio de cadena o hacer algo) y quiero que esto sea como un argumento de paso por referencia. ¿Es posible?

ejemplo:

$test = ''foo''; $test2 = ''bar''; function test(){ $args = func_get_args(); foreach($args as $arg) $arg .= ''baz''; } test($test, $test2);


Necesitaba esta funcionalidad también, se me ocurrió una solución.

function sayhello($params) { //params hold an unlimited amount of references } sayhello([&$one, &$two]);

Esto depende de php> = 5.4 embargo. Si tiene <= 5.4, use la sintaxis array () en lugar de [].

Me encanta [] aunque, mucho mejor :)


Lo dudo mucho de que sea posible, pero sé de una manera que podrías obtener lo que deseas:

function test(&$args) { foreach ($args as $arg) { $arg .= ''baz''; } } test(array(&$test, &$test2));


Usar objetos es la solución

class O { public $v; public function __construct(&$p){ $this->v = &$p; } } function append_baz_to_all(){ foreach(func_get_args() as &$arg){ $arg->v .= ''baz''; } } function test1(){ echo "test1/n"; $a=''A'';$b=''B'';$c=''C'';$d=''D'';$e=''E'';$f=''F'';$g=''G''; echo("/$a=$a /$b=$b /$c=$c /$d=$d /$e=$e /$f=$f /$g=$g/n"); append_baz_to_all(new O($a), new O($b)); echo("/$a=$a /$b=$b /$c=$c /$d=$d /$e=$e /$f=$f /$g=$g/n/n"); } //shortcutting function o(&$v){return new O($v);} function test2(){ echo "test2/n"; $a=''A'';$b=''B'';$c=''C'';$d=''D'';$e=''E'';$f=''F'';$g=''G''; echo("/$a=$a /$b=$b /$c=$c /$d=$d /$e=$e /$f=$f /$g=$g/n"); append_baz_to_all(o($c), o($d), o($e)); echo("/$a=$a /$b=$b /$c=$c /$d=$d /$e=$e /$f=$f /$g=$g/n/n"); } test1(); test2();


Desde PHP-5.6 puede usar una referencia variadica :

function test(&...$args) { foreach ($args as &$arg) { $arg .= ''baz''; } }


function byref_alias() { //$argz=func_get_args(); //byval, not what you want $argz=debug_backtrace()[0][''args'']; //byref hack $argz[0]++; works }


Funciona bien para mí cuando hago algo como el siguiente ejemplo. Creo que la clave es establecer la referencia en el foreach.

$var1 = ''%DIR%/test''; replaceParameters( $var1, $var2, $var3 ); function replaceParameters(&$variables) { $variables = array_filter(func_get_args()); $parameters = [ ''%DIR%'' => __DIR__, ''%FILE%'' => __FILE__, ]; foreach($variables as &$variable) { $variable = str_replace(array_keys($parameters), array_values($parameters), $variable); } }


Como se responde en PHP: lista de argumentos de longitud variable por referencia? , no hay forma de que en PHP se combinen argumentos de función de longitud variable y paso por referencia. En cambio, la respuesta vinculada usa un truco para declarar 100 &argx s, y luego usa get_num_args() para calcular cuántos realmente se usaron. Felicitaciones, encontraste un rincón particularmente difícil en PHP;)