autre question non documentee : executi on dans une condition

Le
Olivier Masson
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Olivier Miakinen
Le #20928761
Le 08/01/2010 16:06, Olivier Masson a écrit :

[...]
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* :

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
Le #20929391
> 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:
Olivier Miakinen
Le #20929821
Le 08/01/2010 18:49, Fredchou me répondit :

[à 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 ... »
Mickael Wolff
Le #20938241
Fredchou a écrit :
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
Olivier Masson
Le #20938251
Le 08/01/2010 19:39, Olivier Miakinen a écrit :

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
Le #20954471
Olivier Masson, le 09/01/2010 a écrit :
Le 08/01/2010 19:39, Olivier Miakinen a écrit :

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 "f1n";return FALSE;}
function f2(){print "f2n";return TRUE;}

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

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" : "perdun";
print !(!f1() | !f2()) ? "gagnén" : "perdun";


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
Le #20955431
Le 12/01/2010 08:50, Pierre Maurette a écrit :

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




en effet.

Le @ ne le fait pas ?




Il me semble que c'est une fatale.
Publicité
Poster une réponse
Anonyme