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

juch
Invité n'ayant pas de compte PHPfrance

25 juil. 2007, 18:01

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

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

25 juil. 2007, 18:09

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

ViPHP
ViPHP | 4674 Messages

25 juil. 2007, 18:13

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();.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

25 juil. 2007, 18:26

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.

ViPHP
ViPHP | 4674 Messages

25 juil. 2007, 18:37

Au temps pour moi alors :) Je savais pas.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

juch
Invité n'ayant pas de compte PHPfrance

26 juil. 2007, 12:01

Ok merci de vos réponses je vais essayer de ce pas :)

Petit nouveau ! | 2 Messages

26 juil. 2007, 12:32

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 !

ViPHP
ViPHP | 4674 Messages

26 juil. 2007, 12:58

N'oublies pas de mettre le sujet en "Résolu" :)
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Petit nouveau ! | 2 Messages

26 juil. 2007, 13:17

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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

26 juil. 2007, 14:12

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é).
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer