Fonction. Cas spécial avec arguments facultatifs. Que faire ? :/

Fonction. Cas spécial avec arguments facultatifs. Que faire ? :/ - PHP - Programmation

Marsh Posté le 23-09-2005 à 20:54:48    

Bonjour,
 
il ya un truc que je n'arrive pas a faire, et je ne comprend meme pas pourquoi ca n'est pas possible :/
 
VOila mon code :
 

Code :
  1. <?php
  2. function foo($a=1, $b=2, $c=3) {
  3. return $a.'-'.$b.'-'.$c;
  4. }
  5. echo foo(5); // Affiche 5-2-3
  6. echo foo(NULL, 4, 5); // Affiche -4-5    et je voudrais que ca affiche 1-4-5
  7. ?>


 
Donc on voit que j'utilise des arguments facultatifs.
 
Et malgrés que l'ont passé la valeur NULL a ne prend pas sa valeur par defaut.  
 
Le seul moment ou a prend sa valeur par defaut c si on fait  
 
echo foo();
 
par exemple !
 
Mais ca pose problème quand on veut definir une valeur differente aux arguments qui suivent ! On ne peut pas faire foo( , 5, 6); --> parse error
 
Donc voila si quelqu'un a une solution a ce prob ?  
 
Merci ^^


---------------
Recherche de partenaires pvp dans World of Warcraft :: http://www.wowteamfinder.com
Reply

Marsh Posté le 23-09-2005 à 20:54:48   

Reply

Marsh Posté le 23-09-2005 à 21:44:01    

Je ne crois pas que PHP permette de sauter des arguments, c'est comme en C/C++, tu charges les arguments linéairement et les arguments par défaut sont à la fin.
 
En python, c'est possible par contre [:spamafote]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-09-2005 à 22:05:54    

Arf c'est con car car les arguments vide peuvent dans mon cas peuvent varier donc peut importe l'ordre..., c lourd, bon ben va falloir coder a la porc tant pis :D
 
Merci pour ta réponse entk
 
A+


---------------
Recherche de partenaires pvp dans World of Warcraft :: http://www.wowteamfinder.com
Reply

Marsh Posté le 23-09-2005 à 22:10:11    

au lieu de passer des arguments normaux, essaie en passant un array ;)
 
genre au lieu d'appeler foo(a, b, c) tu appelles

foo(array("a"=>a,"b"=>b,"c"=>c))


 
et dans "foo", tu testes si les clés "a", "b" et "c" sont présentes et tu réagis en concéquence.
 
C'est pas vraiment propre, mais bon [:spamafote]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-09-2005 à 22:15:29    

Salut oui il ya plein de possibilités pour contourner mais ca reste du code un peu trop porc a mon gout, enfin tant pis :) si ya pas d'autres moyen  
 
^^
 
Merci quand même


---------------
Recherche de partenaires pvp dans World of Warcraft :: http://www.wowteamfinder.com
Reply

Marsh Posté le 23-09-2005 à 22:15:49    

Un truc comme ça :
 

Code :
  1. function foo($arr = array(1, 2, 3)) {   
  2. $default = array(1, 2, 3);
  3. for ($i = 0; $i < 3; $i++) {
  4.  if ($arr[$i] == null) {
  5.   $arr[$i] = $default[$i];
  6.  }
  7. }
  8. echo $arr[0], '-', $arr[1], '-', $arr[2];
  9. }


 
Mais c'est si vraiment y'a pas le choix.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 23-09-2005 à 22:28:09    

il n'y a pas d'opérateur ternaire en PHP [:petrus dei]
 
(et ton truc ça fonctionne pas, si il donne 2 valeurs sur 3 l'array va être peuplé, donc l'array par défaut ne sera pas utilisé et il l'aura dans le cul)
 
[troll]C'est con quand même, en python il aurait suffit de faire

>>> def foo(a=1, b=2, c=3):
...     return "%d-%d-%d"%(a,b,c)
...
>>> foo(12)
'12-2-3'
>>> foo(b=51)
'1-51-3'
>>> foo(c=13, b=412)
'1-412-13'


 
[/troll]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-09-2005 à 22:32:49    

masklinn a écrit :

il n'y a pas d'opérateur ternaire en PHP [:petrus dei]


 
Là ça obligerait à tout faire en même temps, affichage et vérification de l'égalité avec null, bof. Surtout si y'avait + de valeurs.
 

Citation :


(et ton truc ça fonctionne pas, si il donne 2 valeurs sur 3 l'array va être peuplé, donc l'array par défaut ne sera pas utilisé et il l'aura dans le cul)


 
Ben ouais faut remplir avec des null.
 
M'enfin c'était que le concept là, après on l'arrange comme on veut. [:spamafote]


Message édité par sielfried le 23-09-2005 à 22:33:34

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 23-09-2005 à 22:39:36    

Dtf suffit de rajouter un isset.
 

Code :
  1. function foo($arr = array(1, 2, 3)) {   
  2. $default = array(1, 2, 3);
  3. for ($i = 0; $i < 3; $i++) {
  4.  if (!isset($arr[$i])) {
  5.   $arr[$i] = $default[$i];
  6.  }
  7. }
  8. echo $arr[0], '-', $arr[1], '-', $arr[2];
  9. }


Message édité par sielfried le 24-09-2005 à 16:16:13

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 24-09-2005 à 14:07:52    

Gat$ a écrit :

c lourd, bon ben va falloir coder a la porc tant pis :D


boarf, c un ptit peu lourd mais

Code :
  1. function dummy($a=null, $b=null, $c=null){
  2.   if (is_null($a)) $a = 1;
  3.   if (is_null($c)) $b = 2;
  4.   if (is_null($c)) $c = 3;
  5.   return "$a - $b - $c";
  6. }
  7. echo dummy(null, 88, 32);


effectivement, ça fait un peu répétition mais
je trouve pas ça si "porcasse" que ça ;)
 
--
 
Ah oui, au passage :
Masklinn a écrit : "il n'y a pas d'opérateur ternaire en PHP"
??? mais ça alors, qu'est-ce que c'est quoi donc ???

Code :
  1. $foo = isset($bar) ? "bar is set" : "bar is not set";


a+
shakpana

Reply

Marsh Posté le 24-09-2005 à 14:07:52   

Reply

Marsh Posté le 24-09-2005 à 15:40:25    

shakpana a écrit :

Masklinn a écrit : "il n'y a pas d'opérateur ternaire en PHP"
??? mais ça alors, qu'est-ce que c'est quoi donc ???


Je crois que t'as raté le fait que c'était une question [:petrus75]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 24-09-2005 à 15:44:23    

masklinn a écrit :

Je crois que t'as raté le fait que c'était une question [:petrus75]


héhé, autant pour moi Masklinn ...
n'avait point vu de '?'
:)
 
[edit pour typo]


Message édité par shakpana le 24-09-2005 à 15:45:14
Reply

Marsh Posté le 24-09-2005 à 15:51:04    

shakpana a écrit :

Code :
  1. function dummy($a=null, $b=null, $c=null){
  2.   if (is_null($a)) $a = 1;
  3.   if (is_null($c)) $b = 2;
  4.   if (is_null($c)) $c = 3;
  5.   return "$a - $b - $c";
  6. }
  7. echo dummy(null, 88, 32);


On peut même faire des if(!$a) si on veut faire court.

Reply

Marsh Posté le 24-09-2005 à 15:56:32    

kalex a écrit :

On peut même faire des if(!$a) si on veut faire court.


moui, mais tu riques d'avoir des soucis si  

Code :
  1. dummy(0,'0', '', false);


mais ça, faut savoir ce qui est acceptable comme paramètres pour la fonction ...
l'interêt est que NULL est plus 'rare' comme parèmetre que '' ou 0 ...
m'enfin ...

Reply

Marsh Posté le 24-09-2005 à 16:04:47    

C'est vrai. J'ai mis ça parce que j'ai une fonction qui ressemble à ça, mais pour des variables str.
 
Sinon, on peut aussi faire $var === NULL. :D

Reply

Marsh Posté le 24-09-2005 à 16:06:40    

toi, t'aimes pas is_null()  :lol:
--
just kidding, tu as raison on évite de faire appel à une fonction :)


Message édité par shakpana le 24-09-2005 à 16:09:18
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed