Page 1 sur 1

fonction qui recoit un nombre variable d'argument par référe

Posté : 25 juil. 2007, 18:01
par juch
bonjour
moi je cherche à faire une fonction qui recoit un nombre variable d'argument par référence
par exemple
$a=1
$b=2
$c=3...
je veux qu'apres la fonction
$a=2
$b=3
$c=4
mon code :
$a = 1;
$b = 2;
$c = 3;
function fonction() 
{
$args = func_get_args();
foreach($args as $value) { $value++; }
}
fonction(&$a,&$b,&$c);
mais après fonction les valeurs sont identiques...
en considérant que je ne veux pas passer par des variables globales est-ce possible ?

merci de vos réponses

Posté : 25 juil. 2007, 18:09
par Hubert Roksor
À ma connaissance c'est impossible, mais tu as deux solutions possibles. Soit une grosse liste d'arguments :
function foo(&$a = null, &$b = null, &$c = null, &$d = null, &$e = null)
{
    if (isset($a))
    {
        ++a;
    }
    if (isset($b))
    {
        ++b;
    }
    // etc...
Soit, plus élégant, tout passer par un tableau (ou un objet)
$a = 1;
$b = 2;
$c = 3;

foo(array(&$a, &$b, &$c));

function foo(array $args)
{
	foreach ($args as &$arg)
	{
		++$arg;
	}
}

var_dump($a,$b,$c);

Posté : 25 juil. 2007, 18:13
par Hywan
Tu ne pourrais pas bidouiller avec call_user_func_array ?
Un truc du genre :
$parameters = array(&$a, &$b, &$c, &$d);
call_user_func_array(array($obj, 'method'), $parameters);
ou
$parameters = array($a, $b, $c, $d);
call_user_func_array(array($obj, 'method'), &$parameters);
Référence placée sur chaque variable, ou seulement sur le tableau de paramètres.

Utiliser call_user_func_array(); te permet de passer un nombre de paramètres variables. Tu peux les récupérer depuis ta fonction/méthode avec func_get_args();.

Posté : 25 juil. 2007, 18:26
par Hubert Roksor
Tu peux les récupérer depuis ta fonction/méthode avec func_get_args();.
func_get_args() te fait perdre les références si elles ne sont pas dans un tableau ou objet. La seule façon de passer un nombre variable de variables par références c'est de tout mettre dans un tableau/objet.

Posté : 25 juil. 2007, 18:37
par Hywan
Au temps pour moi alors :) Je savais pas.

Posté : 26 juil. 2007, 12:01
par juch
Ok merci de vos réponses je vais essayer de ce pas :)

Posté : 26 juil. 2007, 12:32
par juch
merci Hubert :)

ta solution avec un tableau me convient parfaitement
j'avais deja essayé mais avec une petite erreur ce qui fait que j'avais abandonné l'idée ^^

je faisais :
foreach ($args as $arg)
au lieu de :
foreach ($args as &$arg)
Encore merci !

Posté : 26 juil. 2007, 12:58
par Hywan
N'oublies pas de mettre le sujet en "Résolu" :)

Posté : 26 juil. 2007, 13:17
par juch
je ne trouve pas comment faire lol
j'ai crée le message en invité et je me suis inscrit entre temps c peut-etre pour ca

Posté : 26 juil. 2007, 14:12
par zeus
Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération toi-même
en cliquant sur le bouton Image qui s'affiche en haut à gauche de ce sujet
si tu as posté le 1er message en tant que membre (inscrit et identifié).