[PHP] Opérateurs logiques

WRInaute passionné
Bonjour,

Existe t-il une différence entre and, &&, or et || sur la longueur du test dans la condition ?

Code:
if (isset($var) and $var == 'test')
Code:
if (isset($var) && $var == 'test')

Ces 2 conditions s'executent-elles de la même façon ?
Y a t-il un test court et un test long ?
(Car sans test court ce n'est sémantiquement pas correct)

Merci.

Edit ==
 
WRInaute impliqué
dorian53 a dit:
Code:
if (isset($var) and $var = 'test')
ou
Code:
if (isset($var) && $var = 'test')

De plus vous allez affecter la valeur 'test' à la variable $var. Je ne pense pas que ce soit le but recherché.
Ne serait pas plutôt cela
Code:
if (isset($var) and $var == 'test')
ou encore
Code:
if (isset($var) and strcmp('test',$var) == 0)

Cordialement.
 
WRInaute impliqué
Jeviensderio a dit:
and exécute le second test si le premier est vrai, et && exécute les deux dans tous les cas
Selon la doc, ces 2 opérateurs sont identiques et ils n'exécutent la seconde condition que si la première est vraie...
Ca correspond à un "ET ALORS" dans certains langages...
 
WRInaute passionné
En fait cela dépend de la syntaxe:

// "&&" a une précédence supérieure à "and"
$g = true && false; // $g se vera assigner à (true && false), ce qui est false
$h = true and false; // $h se vera assigner à true

Si on rajoute des parenthèses, les opérateurs sont pareils:

<?php
$h = true and false; // $h se vera assigner à true
echo "1) ", $h, "\n";
$h = (true and false);
echo "2) ", $h, "\n";
?>

On écrit verra d'ailleurs!
 
WRInaute passionné
FloBaoti a dit:
Jeviensderio a dit:
and exécute le second test si le premier est vrai, et && exécute les deux dans tous les cas
Selon la doc, ces 2 opérateurs sont identiques et ils n'exécutent la seconde condition que si la première est vraie...
Ca correspond à un "ET ALORS" dans certains langages...


Merci pour vos réponses, c'est vraiment ce point qui m'intéressait.

Ce serait donc visiblement des "testes courts", mais je n'ai pas trouvé cette information dans la doc.
 
WRInaute impliqué
Jeviensderio a dit:
// "&&" a une précédence supérieure à "and"
$g = true && false; // $g se vera assigner à (true && false), ce qui est false
$h = true and false; // $h se vera assigner à true

je dirais plutot que 'and' à une précédence inférieur à '=' et par là même que '&&' est plus fort que '='

'&&' > '=' > 'and'
 
WRInaute occasionnel
Jeviensderio a dit:
and exécute le second test si le premier est vrai, et && exécute les deux dans tous les cas

Il me semble justement que si la première partie est fausse && ne cherche même pas à savoir si la seconde partie est vraie...

style
$b=1;
if ((isset($a))&&($a=$b)) $a ne prendra pas la valeur de $b s'il n'existe pas auparavant

Alors que and execute les deux tests. (peut-être simplement une rédaction trop rapide :D )

Pour choisir entre or et ||, il s'agit de la même chose or testera les deux itérations alors que || ne testera la seconde que si la première est fausse.
 
WRInaute passionné
Le petit programme que j'ai inséré donne la réponse exacte.
Je le mets encore:

<?php
$h = true and false; // $h se vera assigner à true
echo "1) ", $h, "\n";
$h = (true and false);
echo "2) ", $h, "\n";
?>

On voit que les deux conditions sont testées à la fois.
 
WRInaute impliqué
sauf que je si je comprend bien le question initiale la test est plutôt :
Code:
<?php
$h = (true and false); // $h se vera assigner à true
echo "1) ", $h, "\n";
$h = (true && false);
echo "2) ", $h, "\n";
?>
qii doit donner false dans les deux cas
 
WRInaute passionné
J'en suis perdu avec tous vos exemples.

La question est simple et s'illustre simplement avec l'exemple de mon 1er post.
 
WRInaute passionné
Voila un script qui répond clairement à la question:

<?php

$a = 10;
$b = 20;


if(($a = 0) && ($b = 10))
{
echo "Impossible\n";
}

echo "a=$a\n";
echo "b=$b\n";

// si b = 20, alors il y a bien raccourci avec &&

$a = 10;
$b = 20;

if(($a = 0) and ($b = 10))
{
echo "Impossible\n";
}

echo "a=$a\n";
echo "b=$b\n";

// si b = 20, alors il y a bien raccourci avec and

?>

Dans les deux cas, la variable $a est changée tandis que la variable $b ne l'est pas. Il y a donc raccourci avec les deux opérateurs, PHP interprête la première condition (qui est le résultat d'un assignement), trouve false et stoppe.
 
Discussions similaires
Haut