Page 1 sur 1

découverte sur switch

Posté : 31 mars 2013, 19:18
par sirakawa
En convertissant un if en switch, j'ai commis une erreur qui m'a fait découvrir ce comportement étonnant de switch:
<?PHP
error_reporting(E_ALL);
$val = "ies";

$valeurs = array("ues", "ies", "autres");
foreach ($valeurs as $val)
{
	switch ($val == "ues") //commenter cette ligne et décommenter la suivante pour avoir un comportement normal
	//switch($val) 
	{
		case "ues":
			print "ues";
		break;
		case "ies":
			print "ies";
		break;
	default:
		print "defaut";
	}
}
?>
L'analyseur ne voit aucune erreur.
Si vous voulez vous amuser, remplacez switch par sxwitch et tentez de comprendre le message d'erreur....

Re: découverte sur switch

Posté : 01 avr. 2013, 00:42
par moogli
salut,

le comportement est clair :
second cas : tu passe par les trois phase normal, il correspond au trois cas de ton tableau.
premier cas : tu as affiche ues, puis deux fois default. pourquoi ?

parce que tu fait une comparaison dasn le switch (==), donc tu cherche switch, ou false dans les case.

donc 1er élément du tableau $val == $ues, c'est vrai l’évaluation vaut true.
donc, avec l'auto cast de php, une chaîne de caractère vaut true, le premier cas est validé, on affiche ues, et on quite le switch.
les deux boules suivantes le test est évaluer à false, donc aucun des deux cas les deux premier case ne correspondent pas (une de caractère est évalué à true, donc différent de false) on tombe sur le default.
donc affiche uesdefaultdefault.

Si tu inverse les deux case tu aura afficher iesdefaultdefault.

Donc effectivement il n'y a pas d'erreur, puisse que php évalue la condition avant d'effectuer le switch. Ensuite le reste dépend de ce que tu veux, mais franchement qu'elle est l'intérer d'un booleen en paramètre d'un switch ? un if / else fait très bien l'affaire, c'est même fait pour cela :mrgreen:


donc rien d'anormale, tous va bien, il faut penser à ce que l'on fait :)


@+

Re: découverte sur switch

Posté : 01 avr. 2013, 08:21
par sirakawa
Dans mon cas, le booleen en paramètre du switch était une distraction. Mais jez vien de vérifier dans les contributions à la doc, et il y a plusieurs exemples d'emploi "valides" de switch avec un booléen; et aussi (switch ($++); switch(fonction()).....
Ma remarque était motivée par l'étonnement qu'on puisse passer un booléen en paramètre.

Re: découverte sur switch

Posté : 01 avr. 2013, 11:33
par moogli
Ah ok je comprend mieux.

Tous est possible du fait du faible typage et de l'auto cast, mais trouve que cela complexifie le code pour pas grand chose ;)
(Par exemple le $i++ c'est vicieux pour les gens qui connaissent pas la subtilité de la post incrementation :lol: (vécu avec une dev d'origine oracle et va qui ne connaissais pas).

Par exemple, en java, ce n'est que depuis la dernière version que l'on peut utiliser des chaînes de caractères en plus des entiers dans le switch. Je suppose que c'est la même chose pour d'autre langage typé

@+

Re: découverte sur switch

Posté : 01 avr. 2013, 16:37
par sirakawa
Si je me souviens bien, c'était le cas pour le C.
En revanche le select de Basic est beaucoup plus riche en possibilités
Dim number As Integer = 8
Select Case number
Case 1 To 5
Debug.WriteLine("Between 1 and 5, inclusive")
' The following is the only Case clause that evaluates to True.
Case 6, 7, 8
Debug.WriteLine("Between 6 and 8, inclusive")
Case 9 To 10
Debug.WriteLine("Equal to 9 or 10")
Case 11 To& 4, 17 To 19, Is > maxNumber
Case Else
Debug.WriteLine("Not between 1 and 10, inclusive")
End Select