Nouveau sujet Répondre Imprimer Syndication RSS 2.0

Problème d'opérateur

Equipe des MODS
Avatar de Met@lnono
  • Age : 26 ans
  • Messages : 1170
  • Inscrit : 17 Octobre 2005
Message édité 1 fois, dernière édition par Met@lnono, 17 Mars 2008, 13:45     Lien vers ce message 17 Mars 2008, 13:44
Dans mon mode Image Animation j'utilise ce code :
					if ($value == 'lightbox' || 'slimbox')
					{
						return '<a href="' . trim($content) . '" rel="lightbox"><img src="' . trim($content) . '" rel="lightbox" onload="resize_img(this)" ' . $attr_str . ' /></a>';
					}
					else if ($value == 'highslide')
					{
						return '<a href="' . trim($content) . '" class="highslide" onclick="return hs.expand(this)"><img src="' . trim($content) . '" onload="resize_img(this)" /></a>';
					}

...et bien, si je remplace ce code :
if ($value == 'lightbox' || 'slimbox')
par celui là
if ($value == 'lightbox' || $value == 'slimbox')
le résultat n'est pas le même, se qui ne me semble pas normal... qu'en pensez vous ?


 
Etoile
Avatar de BlackJowy
  • Age : 22 ans
  • Messages : 3229
  • Inscrit : 01 Mars 2007
Message édité 1 fois, dernière édition par BlackJowy, 17 Mars 2008, 13:59     Lien vers ce message 17 Mars 2008, 13:58
Je dis surement de la merde, mais pour moi c'est normal

la première renverra toujours TRUE parce que tu fait un OU logique entre une chaine (qui en booléen vaut TRUE) et une expression.

la deuxième renverra TRUE si l'une des deux conditions (ou les deux) sont vraies.


"It's backup day today so I'm pissed off. Being the BOFH, however, does have it's advantages. I reassign null to be the tape device — it's so much more economical on my time as I don't have to keep getting up to change tapes every 5 minutes. And it speeds up backups too, so it can't be all bad can it? Of course not." S.Travaglia

 
Equipe de support
Avatar de B.Moncef
  • Age : 17 ans
  • Messages : 1856
  • Inscrit : 10 Septembre 2005
Message édité 1 fois, dernière édition par B.Moncef, 17 Mars 2008, 14:38     Lien vers ce message 17 Mars 2008, 14:34
Dans le cas de ton MOD, c'est :
if ($value == 'lightbox' || $value == 'slimbox')
que tu dois utiliser.
L'autre condition ne fait pas grand chose comme l'a dit BJ, elle vaut toujours TRUE, et c'est normal.

Ta condition teste si $value == 'lightbox' OU 'slimbox', or les chaînes de caractères dans des conditions renvoient TRUE (à part quelques unes, genre '0', '',).
Donc deux cas sont possibles après l'évaluation de ce qu'il y a entre parenthèses, soit ta condition est : if (FALSE || TRUE), soit if (TRUE || TRUE), donc ça passe toujours.
 
Feu follet
Avatar de Shaigan
  • Age : 25 ans
  • Messages : 229
  • Inscrit : 11 Juin 2006
  Lien vers ce message 17 Mars 2008, 14:50
if ( $value == ( 'lightbox' || 'slimbox' ) )

Et là, ça passerait ?


http://tristaina.servhome.org/commun/images/shaigan_userbar_mini.png http://tristaina.servhome.org/commun/images/prophecy_webmaster.png
 
Equipe des MODS
Avatar de Met@lnono
  • Age : 26 ans
  • Messages : 1170
  • Inscrit : 17 Octobre 2005
Message édité 1 fois, dernière édition par Met@lnono, 17 Mars 2008, 14:56     Lien vers ce message 17 Mars 2008, 14:55
Se que je trouve bizarre, c'est que dans le parser du FSBCode [img], on retrouve ceci
				if ($name == 'float' && ($value == 'left' || 'right'))

Et j'ai fait quelques tests et ça a l'air de fonctionner ???
if ( $value == ( 'lightbox' || 'slimbox' ) )

Et là, ça passerait ?

J'ai essayé et ça ne passe pas.
Le seul truc qui passe bien c'est
if ($value == 'lightbox' || $value == 'slimbox')


 
Equipe des MODS
Avatar de Fabogranqi
  • Age : 19 ans
  • Messages : 3013
  • Inscrit : 29 Décembre 2004
Message édité 1 fois, dernière édition par Fabogranqi, 17 Mars 2008, 17:16     Lien vers ce message 17 Mars 2008, 17:15
L'opérateur == à un priorité plus grande que ||, c'est donc normal que "if ($value == 'lightbox' || 'slimbox')" et "if ($value == 'lightbox' || $value == 'slimbox')" ne revoient pas les mêmes valeurs ^^.

EDIT: Je viens de trouver cette page qui donne les priorités des opérateurs en PHP, ça pourra t'aider ;)
 
Equipe des MODS
Avatar de Met@lnono
  • Age : 26 ans
  • Messages : 1170
  • Inscrit : 17 Octobre 2005
  Lien vers ce message 17 Mars 2008, 17:30
C'est vrai qu'en y réfléchissant ça peut paraitre normal que les 2 résultats soient différents.
Mais pourquoi est ce que
if ($name == 'float' && ($value == 'left' || 'right'))

ça fonctionne ???


 
Brasier
Avatar de Sékiltoyai
  • Age : 20 ans
  • Messages : 961
  • Inscrit : 19 Septembre 2006
  Lien vers ce message 17 Mars 2008, 17:43
C'est vrai qu'en y réfléchissant ça peut paraitre normal que les 2 résultats soient différents.
Mais pourquoi est ce que
if ($name == 'float' && ($value == 'left' || 'right'))

ça fonctionne ???


Justement ca ne marche pas :

<?php

var_dump('test' || 'test2');
echo "\n";
var_dump('test2' == ('test' || 'test2'));
echo "\n";
var_dump('test' == ('test' || 'test2'));
echo "\n";
var_dump('test1' == ('test' || 'test2'));

?>


Citation
bool(true)

bool(true)

bool(true)

bool(true)


Dans tous les cas, ('test' || 'test2') effectue une opération logique sur 'test' et 'test2', lesquels sont donc castés en booléens, soit TRUE. Ensuite, quand on fait 'test1' == ('test' || 'test2') , on compare une chaine à un booléen, et on caste donc 'test1' en booléen, qui donne TRUE.

Tu as donc dans tous les cas une équivalence de tes conditions avec ce code :
TRUE == (TRUE || TRUE) qui va retourner systématiquement TRUE. N'essaye pas de bidouiller avec les conditions en PHP, tu ne peux pas contracter ton expression.


http://www.phpfrance.com : Support francophone PHP et Web.
 
Equipe des MODS
Avatar de Met@lnono
  • Age : 26 ans
  • Messages : 1170
  • Inscrit : 17 Octobre 2005
Message édité 1 fois, dernière édition par Met@lnono, 17 Mars 2008, 17:50     Lien vers ce message 17 Mars 2008, 17:50
J'essaye pas de bidouiller, j'essaye juste de comprendre pourquoi le code de Geno
if ($name == 'float' && ($value == 'left' || 'right'))

semble fonctioner... il va falloir que je retest car là je ne comprend pas ??? :O


 
Etoile
Avatar de BlackJowy
  • Age : 22 ans
  • Messages : 3229
  • Inscrit : 01 Mars 2007
  Lien vers ce message 17 Mars 2008, 19:08
Ptet qu'il ne marche pas et qu'il a juste fait une boulette :p


"It's backup day today so I'm pissed off. Being the BOFH, however, does have it's advantages. I reassign null to be the tape device — it's so much more economical on my time as I don't have to keep getting up to change tapes every 5 minutes. And it speeds up backups too, so it can't be all bad can it? Of course not." S.Travaglia

 
Equipe de support
Avatar de B.Moncef
  • Age : 17 ans
  • Messages : 1856
  • Inscrit : 10 Septembre 2005
  Lien vers ce message 17 Mars 2008, 21:33
La différence entre ta condition et celle de Géno, c'est que pour toi c'est un OU logique, et dans le parser du FSBCode img c'est un ET logique. Donc elle peut valoir FALSE si $name n'est pas égal à 'float', pas comme ta condition qui vaudra toujours TRUE.
N'empêche que la condition n'est pas correct.
 
Equipe des MODS
Avatar de Met@lnono
  • Age : 26 ans
  • Messages : 1170
  • Inscrit : 17 Octobre 2005
  Lien vers ce message 17 Mars 2008, 22:19
La différence entre ta condition et celle de Géno, c'est que pour toi c'est un OU logique, et dans le parser du FSBCode img c'est un ET logique. Donc elle peut valoir FALSE si $name n'est pas égal à 'float', pas comme ta condition qui vaudra toujours TRUE.
N'empêche que la condition n'est pas correct.
Donc si $name = 'float', alors la condition vaut TRUE quelque soit $value.


 
Brasier
Avatar de Sékiltoyai
  • Age : 20 ans
  • Messages : 961
  • Inscrit : 19 Septembre 2006
  Lien vers ce message 17 Mars 2008, 22:22
Donc si $name = 'float', alors la condition vaut TRUE quelque soit $value.

Voilà…


http://www.phpfrance.com : Support francophone PHP et Web.
 
Equipe des MODS
Avatar de Met@lnono
  • Age : 26 ans
  • Messages : 1170
  • Inscrit : 17 Octobre 2005
  Lien vers ce message 18 Mars 2008, 8:46
Je viens de refaire des test et en effet la condition de Geno ne fonctionne pas.
Il faudrait donc remplacer
if ($name == 'float' && ($value == 'left' || 'right'))

par
if ($name == 'float' && ($value == 'left' || $value == 'right'))

dans le fichier /main/class/parser/parser_fsbcode.php
Ouf ! on y arrive :fsb2_drink:


 
Chef du projet FSB
Avatar de Genova
  • Age : 22 ans
  • Messages : 14190
  • Inscrit : 16 Septembre 2004
  Lien vers ce message 22 Mars 2008, 13:45
Oui c'est une erreur ;)


Cause Im as free as a bird now, And this bird you can not change. - Freebird - Lynyrd Skynyrd
There's someone in my head but it's not me. - Brain damage - Pink Floyd
I said baby, you know Im gonna leave you. - Babe I'm gonna leave you - Led Zeppelin
Father ? yes son, I want to kill you - The end - The Doors
 
Répondre


.