Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

comparaison, variable et booléen

21 views
Skip to first unread message

Une Bévue

unread,
Apr 19, 2012, 2:35:02 AM4/19/12
to
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" ???

Pierre Maurette

unread,
Apr 19, 2012, 12:43:18 PM4/19/12
to
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


Une Bévue

unread,
Apr 19, 2012, 3:06:13 PM4/19/12
to
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 !

Vincent Verdon

unread,
Apr 19, 2012, 3:29:54 PM4/19/12
to
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

Clément

unread,
Apr 20, 2012, 5:30:29 PM4/20/12
to
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 ;)

Une Bévue

unread,
Apr 21, 2012, 3:49:17 AM4/21/12
to
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);

?

Clément

unread,
Apr 21, 2012, 5:07:52 PM4/21/12
to
Effectivement, $is_mac = $mac_address == $imac_mac_address; fonctionne.
Mais est-ce très lisible ? :)

Une Bévue

unread,
May 1, 2012, 2:09:53 AM5/1/12
to
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 ;-)
0 new messages