PHP: liste d'arguments de longueur variable par référence?

Est-il possible de créer une fonction PHP qui prend un nombre variable de paramètres de référence?

Cela ne m'aide pas une fonction qui reçoit par référence un tableau de valeurs ni une fonction qui prend ses arguments enveloppés dans un objet parce que je travaille sur la composition de la fonction et la liaison des arguments. Ne pensez pas non plus au passage par référence du temps d'appel. Cette chose ne devrait même pas exister.

22
demandé sur GetFree 2009-12-18 02:12:13

5 réponses

PHP 5.6 a introduit une nouvelle syntaxe variadique qui supporte la pass-by-reference. (merci @outis pour la mise à jour)

function foo(&...$args) {
    $args[0] = 'bar';
}

Pour PHP 5.5 ou inférieur, vous pouvez utiliser l'astuce suivante:

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
}

Le problème est que le nombre d'arguments est limitée par le nombre d'arguments définis (6 dans l'exemple). mais avec func_num_args (), vous pouvez détecter si d'autres sont nécessaires.

Passer plus de 7 paramètres à une fonction est une mauvaise pratique de toute façon ;)

13
répondu Bob Fanger 2016-01-11 10:14:54

PHP 5.6 introduit une nouvelle syntaxe variadique qui prend en charge la pass-by-reference. Préfixer le dernier paramètre à une fonction avec ... le déclare comme un tableau qui contiendra tous les arguments réels à partir de ce point. Le tableau peut être déclaré pour contenir des références en préfixant davantage le jeton ... avec un &, comme cela est fait pour d'autres paramètres, ce qui rend les arguments pass-by-ref.

Exemple 1:

function foo(&...$args) {
    $args[0] = 'bar';
}
foo($a);
echo $a, "\n";
#  output:
#a

Exemple 2:

function number(&...$args) {
    foreach ($args as $k => &$v) {
        $v = $k;
    }
}
number($zero, $one, $two);
echo "$zero, $one, $two\n";
#  output:
#0, 1, 2
7
répondu outis 2014-10-26 23:59:10

Vous devriez pouvoir passer tous vos paramètres enveloppés dans un objet.


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);

Doit imprimer 1 2

1
répondu BojanG 2009-12-17 23:20:58

Edit: désolé de ne pas avoir vu que vous vouliez qu'ils soient des références....tout ce que vous avez à faire est de passer comme un objet.

Vous pouvez également passer dans un tableau, par exemple

myfunction(array('var1' => 'value1', 'var2' => 'value2'));

Ensuite, dans la fonction vous simplement

myfunction ($arguments) {

echo $arguments['var1'];
echo $arguments['var2'];

}

Les tableaux peuvent également être imbriquées.

1
répondu user103219 2009-12-17 23:25:07

C'est possible:

$test = 'foo';
$test2 = 'bar';

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

test(&$test, &$test2);

Toutefois, cette utilise pour passer de référence qui est obsolète.

1
répondu newacct 2011-09-01 23:12:46