comparaison, variable et booléen

7 réponses
Avatar
Une Bévue
j'ai une ligne php qui assigne à une variable le contenu d'une
comparaison, j'ai fait ça comme ça :

$is_mac = ($mac_address == $imac_mac_address) true : false;

quand je fais :

echo "\$is_imac = $is_imac<br />";

j'obtiens :

$is_imac =

quand le résultat est faux

et :

$is_imac = 1

quand le résultat est vrai

normal ?

puis-je faire plus court, du genre :


$is_mac = ($mac_address == $imac_mac_address);

càd sans "? true : false" ???

7 réponses

Avatar
Pierre Maurette
Une Bévue :
j'ai une ligne php qui assigne à une variable le contenu d'une comparaison,
j'ai fait ça comme ça :

$is_mac = ($mac_address == $imac_mac_address) true : false;



Il manque un '?', sans doute une typo. J'écris plutôt TRUE et FALSE
pour les constantes booléennes, mais ça ne doit pas changer quoi que de
soit.

quand je fais :

echo "$is_imac = $is_imac<br />";



Là, il y a une conversion d'un booléen en chaîne, cette conversion
donne:
TRUE -> '1'
FALSE -> ''
C'est comme ça, je n'en sais pas plus.

j'obtiens :

$is_imac >
quand le résultat est faux

et :

$is_imac = 1

quand le résultat est vrai

normal ?



Oui.

puis-je faire plus court, du genre :


$is_mac = ($mac_address == $imac_mac_address);

càd sans "? true : false" ???



Bien entendu, s'il s'agit d'affecter à $is_mac une valeur booléenne.
Ajouter le ? true : false; est même une redondance à la limite de la
faute.

En revanche, pour en faire qualque chose de plus facile à lire (et qui
accessoirement continuera dans beaucoup de cas à pouvoir être utilisé
comme un booléen, dans un test par exemple:
$is_mac = ($mac_address == $imac_mac_address)?1:0;
$is_mac = ($mac_address == $imac_mac_address)?'1':'0';
$is_mac = ($mac_address == $imac_mac_address)?'ben vrai, alors...':'ben
non...';

Vous pouvez garder votre variable sous forme booléenne, et juste pour
l'afficher utiliser l'opérateur ternaire:
print($is_mac?'1':'0');
print($is_mac?1:0);
ou alors utiliser (int)$is_mac, attention, (string)FALSE donne '', il
faudrait faire (string)(int)FALSE pour obtenir '0', il doit y avoir
plus simple.
Notez que le forçage (bool)expression peut s'écrire !!expression, il
n'y a pas de petite économie.

--
Pierre Maurette
Avatar
Une Bévue
Le 19/04/2012 18:43, Pierre Maurette a écrit :
Une Bévue :
j'ai une ligne php qui assigne à une variable le contenu d'une
comparaison, j'ai fait ça comme ça :

$is_mac = ($mac_address == $imac_mac_address) true : false;



Il manque un '?', sans doute une typo. J'écris plutôt TRUE et FALSE pour
les constantes booléennes, mais ça ne doit pas changer quoi que de soit.



Oui, le "?" était dans la source, par contre oui, je pense que c'est
plus judicieux TRUE / FALSE, ce sont des constantes pédéfinies.

quand je fais :

echo "$is_imac = $is_imac<br />";



Là, il y a une conversion d'un booléen en chaîne, cette conversion donne:
TRUE -> '1'
FALSE -> ''
C'est comme ça, je n'en sais pas plus.



Bon, c'est à savoir, c'est tout.

j'obtiens :

$is_imac >>
quand le résultat est faux

et :

$is_imac = 1

quand le résultat est vrai

normal ?



Oui.

puis-je faire plus court, du genre :


$is_mac = ($mac_address == $imac_mac_address);

càd sans "? true : false" ???



Bien entendu, s'il s'agit d'affecter à $is_mac une valeur booléenne.
Ajouter le ? true : false; est même une redondance à la limite de la faute.



OK

En revanche, pour en faire qualque chose de plus facile à lire (et qui
accessoirement continuera dans beaucoup de cas à pouvoir être utilisé
comme un booléen, dans un test par exemple:
$is_mac = ($mac_address == $imac_mac_address)?1:0;
$is_mac = ($mac_address == $imac_mac_address)?'1':'0';
$is_mac = ($mac_address == $imac_mac_address)?'ben vrai, alors...':'ben
non...';

Vous pouvez garder votre variable sous forme booléenne, et juste pour
l'afficher utiliser l'opérateur ternaire:
print($is_mac?'1':'0');



Vu, c'est + élégant...

print($is_mac?1:0);
ou alors utiliser (int)$is_mac, attention, (string)FALSE donne '', il
faudrait faire (string)(int)FALSE pour obtenir '0', il doit y avoir plus
simple.
Notez que le forçage (bool)expression peut s'écrire !!expression, il n'y
a pas de petite économie.




OK, merci bien pour cette réponse claire et précise !
Avatar
Vincent Verdon
Bonsoir,

Le 19/04/2012 21:06, Une Bévue a écrit :

Oui, le "?" était dans la source, par contre oui, je pense que c'est
plus judicieux TRUE / FALSE, ce sont des constantes pédéfinies.




Pour être exact, ce sont des mots clefs du langage, dont le manuel
indique qu'ils sont insensibles à la casse. Les écrire en majuscule
n'est pas une mauvaise idée, ma foi !

Amicalement, Vincent Verdon
Avatar
Clément
Le 19/04/2012 08:35, Une Bévue a écrit :
j'ai une ligne php qui assigne à une variable le contenu d'une
comparaison, j'ai fait ça comme ça :

$is_mac = ($mac_address == $imac_mac_address) true : false;




L'opération ternaire est ici inutile.
$is_mac = $mac_address == $imac_mac_address;
suffirait ici.

quand je fais :

echo "$is_imac = $is_imac<br />";

j'obtiens :

$is_imac >
quand le résultat est faux

et :

$is_imac = 1

quand le résultat est vrai

normal ?



ça s'appelle le transtypage. Plus d'infos dans la doc ici :
http://fr2.php.net/manual/fr/language.types.type-juggling.php

En gros false (le booléen) devient 0 (en int) et "" en string
puis-je faire plus court, du genre :


$is_mac = ($mac_address == $imac_mac_address);

càd sans "? true : false" ???


cf le début ;)
Avatar
Une Bévue
Le 20/04/2012 23:30, Clément a écrit :

L'opération ternaire est ici inutile.
$is_mac = $mac_address == $imac_mac_address;
suffirait ici.



OK, merci bien, si je comprends bien, il n'est même pas utile de
parenthéser :

$is_mac = ($mac_address == $imac_mac_address);

?
Avatar
Clément
Le 21/04/2012 09:49, Une Bévue a écrit :
Le 20/04/2012 23:30, Clément a écrit :

L'opération ternaire est ici inutile.
$is_mac = $mac_address == $imac_mac_address;
suffirait ici.



OK, merci bien, si je comprends bien, il n'est même pas utile de
parenthéser :

$is_mac = ($mac_address == $imac_mac_address);

?


Effectivement, $is_mac = $mac_address == $imac_mac_address; fonctionne.
Mais est-ce très lisible ? :)
Avatar
Une Bévue
Le 21/04/2012 23:07, Clément a écrit :



Effectivement, $is_mac = $mac_address == $imac_mac_address; fonctionne.
Mais est-ce très lisible ? :)



bonne remarque ;-)