Skip to content

Instantly share code, notes, and snippets.

@jmfontaine
Last active December 10, 2015 19:48
Show Gist options
  • Save jmfontaine/4483544 to your computer and use it in GitHub Desktop.
Save jmfontaine/4483544 to your computer and use it in GitHub Desktop.
PHP && operator can break foreach loops Edit: I was wrong. There is no break here.
<?php
function isOk($message) {
echo $message . PHP_EOL;
return 'Error' !== $message;
}
$messages = array('Info', 'Error', 'Info');
$isOk = true;
foreach ($messages as $message) {
$isOk = $isOk && isOk($message);
}
var_dump($isOk);
echo '------------' . PHP_EOL;
$isOk = true;
foreach ($messages as $message) {
if (!isOk($message)) {
$isOk = false;
}
}
var_dump($isOk);
@clemherreman
Copy link

C'est normal, lors de ton 3eme passage dans le premier foreach (ici https://gist.github.com/4483544#file-gistfile1-php-L12), $isOk est égal à false.

Du coup $isOk && isOk($message) deviens false && isOk($message). L'interpreteur s'arrête au premier false, et n'évalue pas le reste de l'expression, qui se trouve après &&. D'où l'absence d'echo de Info.

De manière générale, je me méfie de mélanger évaluation et execution/affectation, je me suis déjà fait avoir avant.

@jmfontaine
Copy link
Author

C'est bien ce que j'avais compris mais je suis étonné que ce comportement ne soit pas limité aux comparaisons.

Par contre, tu as raison, mon interprétation était fausse : il ne fait pas de break. Il termine la boucle mais simplement n'affiche pas les messages.

@clemherreman
Copy link

Oui, il fini la boucle, mais n'évalue jamais isOk(). Qu'est ce qui t'étonnes, je ne saisis pas ?

@jmfontaine
Copy link
Author

Ce qui m'étonnait c'était qu'il fasse un break implicite mais c'était une erreur d'interprétation de ma part donc plus rien ne m'étonne à présent (si ce n'est ma bêtise).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment