Discussion:
autre question non documentee : executi on dans une condition
(trop ancien pour répondre)
Olivier Masson
2010-01-08 15:06:07 UTC
Permalink
ReB,

Encore un problème pour lequel je n'ai pas trouvé de solution dans la doc.
J'ai une condition de ce genre :
if (!copy($foo,$dest) && !copy($bar,$dest))

Ce qui m'évite de faire un accès fichier supplémentaire avec file_exists
avant.
Mais voilà le problème : si la copie de $foo est bien effectuée, je NE
veux PAS que $bar le soit.

D'où ma question (pour savoir si je peux garder une telle condition) :
est-il clair que, lors de l'utilisation d'un OU (||), seule la première
condition est évaluée (ce qui est absolument logique) ?

J'ai testé et c'est bien le cas, mais j'ai toujours peur que PHP me
cache quelque chose...
Olivier Miakinen
2010-01-08 16:46:21 UTC
Permalink
Post by Olivier Masson
[...]
est-il clair que, lors de l'utilisation d'un OU (||), seule la première
condition est évaluée (ce qui est absolument logique) ?
J'ai testé et c'est bien le cas, mais j'ai toujours peur que PHP me
cache quelque chose...
Comme souvent, la doc PHP n'est pas très explicite. Pourtant, l'info est
bien donnée dans la doc, dans un *commentaire* d'un *exemple* :

<http://www.php.net/manual/en/language.operators.logical.php>
Example #1

// --------------------
// foo() will never get called as those operators are short-circuit

$a = (false && foo());
$b = (true || foo());
$c = (false and foo());
$d = (true or foo());
</>

Note que ce comportement est calqué de celui du C, ce qui est aussi une
grande caractéristique de PHP.
Fredchou
2010-01-08 17:49:22 UTC
Permalink
Post by Olivier Miakinen
Note que ce comportement est calqué de celui du C, ce qui est aussi une
grande caractéristique de PHP.
Moi je n'ai jamais trouvé cette syntaxe très lisible, en C comme en PHP. Je
préfère imbriquer deux "if then".
--
Fredchou
mailto:***@nospam.free.fr.invalid
Olivier Miakinen
2010-01-08 18:39:14 UTC
Permalink
Post by Fredchou
[à propos de « if (!copy($foo,$dest) && !copy($bar,$dest)) »]
Moi je n'ai jamais trouvé cette syntaxe très lisible, en C comme en PHP. Je
préfère imbriquer deux "if then".
Chacun ses goûts (et ses habitudes), c'est comme pour l'opérateur
ternaire (« ?: ») que certains trouvent plus lisible que des if alors
que d'autres le trouvent moins lisible.

En ce qui concerne la ligne citée par Olivier Masson (et que j'ai
reprise ci-dessus), presonnellement je la trouve relativement lisible.
Je la lis « si je n'ai pas pu copier $foo en $dest, et que je n'ai pas
pu copier non plus $bar en $dest, alors ... »
Olivier Masson
2010-01-09 22:04:02 UTC
Permalink
Post by Olivier Miakinen
En ce qui concerne la ligne citée par Olivier Masson (et que j'ai
reprise ci-dessus), presonnellement je la trouve relativement lisible.
Je la lis « si je n'ai pas pu copier $foo en $dest, et que je n'ai pas
pu copier non plus $bar en $dest, alors ... »
Merci pour ta précision documentée.
En fait, je trouve que ça tombe sous le sens, donc ça m'est tout à fait
naturel de l'utiliser. Mais n'étant pas développeur, j'ignore encore bcp
des rouages des langages, alors je me méfie.
Et par exemple, PHP me balance parfois des erreurs du style "[...] in
write context" ou encore veut absolument retourner quelque chose sans
que je puisse lui dire de se taire.
Pierre Maurette
2010-01-12 07:50:41 UTC
Permalink
Post by Olivier Masson
Post by Olivier Miakinen
En ce qui concerne la ligne citée par Olivier Masson (et que j'ai
reprise ci-dessus), presonnellement je la trouve relativement lisible.
Je la lis « si je n'ai pas pu copier $foo en $dest, et que je n'ai pas
pu copier non plus $bar en $dest, alors ... »
Merci pour ta précision documentée.
En fait, je trouve que ça tombe sous le sens, donc ça m'est tout à fait
naturel de l'utiliser. Mais n'étant pas développeur, j'ignore encore bcp des
rouages des langages, alors je me méfie.
Je fais peu de PHP, et j'ai l'habitude dans tous les langages
d'utiliser si possible l'évaluation économique (paresseuse, minimale)
des booléens, qui me donne des trucs que je trouve très lisibles.
J'avais remarqué que l'évidence dont vous parlez n'était pas vraiment
reprise dans la documentation, et j'avais fait comme vous, poser la
question sur usenet.
Je résume à toutes fins utiles ce que je pense à retenir pour PHP.
L'évaluation économique consiste à garantir une évaluation de gauche à
droite, et ensuite l'arrêt de l'évaluation dès que le résultat est
connu. Bout de test:

function f1(){print "f1\n";return FALSE;}
function f2(){print "f2\n";return TRUE;}

print f1() && f2() ? "gagné\n" : "perdu\n";
print !(!f1() || !f2()) ? "gagné\n" : "perdu\n";

Attention, si on utilise les opérateurs bitwise & et |, on forcera à
l'évaluation complète, ce qui peut être utile:

print f1() & f2() ? "gagné\n" : "perdu\n";
print !(!f1() | !f2()) ? "gagné\n" : "perdu\n";
Post by Olivier Masson
Et par exemple, PHP me balance parfois des erreurs du style "[...] in write
context" ou encore veut absolument retourner quelque chose sans que je puisse
lui dire de se taire.
Le @ ne le fait pas ?
--
Pierre Maurette
Olivier Masson
2010-01-12 09:48:41 UTC
Permalink
Post by Pierre Maurette
Attention, si on utilise les opérateurs bitwise & et |, on forcera à
en effet.
Il me semble que c'est une fatale.

Mickael Wolff
2010-01-09 22:04:02 UTC
Permalink
Post by Fredchou
Moi je n'ai jamais trouvé cette syntaxe très lisible, en C comme en PHP. Je
préfère imbriquer deux "if then".
Ca dépend de ce que tu mets dans tes conditions. Mais c'est vrai que
c'est surtout utile en C, pour vérifier un pointeur puis de faire un
test derrière sur ce pointeur.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Loading...