Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

autre question non documentee : executi on dans une condition

7 réponses
Avatar
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...

7 réponses

Avatar
Olivier Miakinen
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* :

<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.
Avatar
Fredchou
> 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:
Avatar
Olivier Miakinen
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 ... »
Avatar
Mickael Wolff
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
Avatar
Olivier Masson
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.
Avatar
Pierre Maurette
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
Avatar
Olivier Masson
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.