Quelque chose qui voudrait vraiment savoir, mais jamais découvert, sont des raccourcis en PHP.
Je suis en train de coder une fonction avec une boucle foreach
avec juste une seule déclaration à l'intérieur. J'ai essayé d'omettre les accolades, comme vous pouvez le faire dans les structures de contrôle if/else et cela fonctionne. Aucune erreur.
foreach($var as $value)
$arr[] = $value;
Maintenant, j'ai essayé de l'utiliser de la même manière, mais en y insérant un bloc if/else. Encore une fois, en travaillant et pas d'erreurs.
foreach($var as $value)
if(1 + 1 == 2) {
$arr[] = $value;
};
Ensuite, j'ai pensé "Pourquoi ça marche?" et omis le point-virgule de fermeture. Je travaille encore. J'ai donc essayé d'utiliser l'instruction if/else sans accolades à l'intérieur de la boucle foreach et encore une fois, fonctionnant toujours et sans erreur. Mais la boucle foreach est-elle vraiment fermée/terminée en ce moment?
foreach($var as $value)
if(1 + 1 == 2)
$arr[] = $value;
Au moins, j'ai encore omis le point-virgule de fermeture et (comme prévu) une erreur d'analyse est survenue.
Ma grande question est donc la suivante: quand puis-je omettre les accolades et dans quelle structure/boucle/fonction? Je sais que je peux certainement le faire avec if
et else
. Mais qu'en est-il de while
, for
et foreach
?
Et oui, je sais que ce n'est pas sûr, malin, de coder sans accolades et qu'il existe des raccourcis comme $condition ? true : false;
et if: doSomething(); endif;
, endfor;
et endforeach;
. Je ne veux pas en savoir plus sur les raccourcis. Je veux simplement comprendre les conditions permettant de savoir quand et où il est possible d'omettre les accolades.
Lorsque vous omettez les accolades, la déclaration suivante n'est traitée que comme le corps de la condition.
if ($x) echo 'foo';
est le même que
if ($x) { echo 'foo'; }
mais rappelez-vous que
if ($x)
echo 'foo';
echo 'bar';
sera toujours print "bar"
En interne, c'est l'inverse: if
ne regardera que l'expression suivante, mais PHP traite tout le contenu de {}
comme une seule expression "groupée".
Idem pour les autres instructions de contrôle (foreach
, etc.)
Il y a des endroits où vous pouvez, mais vous ne devriez jamais.
Explicit est toujours meilleur qu'implicite.
Qui sait quand vous devrez revenir en arrière et modifier l'ancien code. C'est tellement facile de rater ça et ça ne sert à rien de le faire.
Cela fonctionnera bien si vous n'avez qu'un seul argument à l'intérieur! Mais si vous voulez omettre les accolades, vous pouvez utiliser les points et se terminer par ...
if(a < 1 ) :
echo "a is less than 1";
else :
echo "a is greater than 1";
endif;
Comme je l'ai déjà dit, vous ne voulez pas en savoir plus sur le raccourci et la réponse acceptée donne un bon exemple pour omettre curly braces
, mais il y a quelque chose à ajouter. Comme vous pouvez le constater, il est correct d’omettre curly braces
en cas de if ($x) echo 'foo';
. Il n'y a rien de mal avec le code, pas de performances ou d'autres problèmes et il est lisible par d'autres développeurs. Et exemple vous montre également que si vous écrivez
if ($x)
echo 'foo';
echo 'bar';
au lieu de
if ($x)
echo 'foo';
echo 'bar';
Vous pouvez rencontrer des résultats non désirés où bar
est imprimé alors que vous ne le souhaitez pas et si votre code est rempli de telles déclarations, il sera alors plus difficile pour vous de lire votre propre code et encore plus difficile à lire pour les autres. il.
Je ne veux pas en savoir plus sur le raccourci. Je veux juste comprendre les conditions permettant de savoir quand et où il est possible d'omettre les accolades.
Ces éléments sont étroitement liés, donc si vous voulez vraiment comprendre où il est possible d’omettre les accolades, c’est une obligation que vous comprenez ou que vous êtes au moins conscient de la sténographie, lisez ce qui suit:
Ma grande question est donc la suivante: quand puis-je omettre les accolades et dans quelle structure/boucle/fonction?
L'accolade n'est pas nécessaire, cependant, pour des raisons de lisibilité et de maintenance, de nombreux développeurs considèrent qu'il est mauvais de ne pas les inclure. Les 2 liens précédents devraient vous donner les informations nécessaires pour prendre vos propres décisions lorsque vous pouvez omettre les accolades . Par exemple, il n’ya rien de mal à suivre des extraits de code qui font tous exactement la même chose.
Avec accolade
if (PHP_VERSION_ID < 70000)
{
print "PHP >= 7.0 required yours is ";
print phpversion();
print "\n";
exit(1);
}
Est identique à
if (PHP_VERSION_ID < 70000) :
print "PHP >= 7.0 required yours is ";
print phpversion();
print "\n";
exit(1);
endif;
Ou vous pouvez utiliser l'opérateur de points
if (PHP_VERSION_ID < 80000)
(print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n") . exit(1);
Et vous pouvez utiliser l'opérateur conditionnel ternaire et même omettre if
il-même en plus des ombrages
(PHP_VERSION_ID > 70000) ?: (print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n") . exit(1);
Puisque nous n'imprimons que nous pouvons raccourcir cela et effacer quelques print string functions
qui étaient ici pour représenter plus d'une fonction dans une instruction sans accolades
(PHP_VERSION_ID > 70000) ?: (print "PHP >= 7.0 required yours is " . phpversion() . "\n") . exit(1);
A partir de PHP 7, nous pouvons utiliser l'opérateur de coalescence Null
(PHP_VERSION_ID > 70000) ?: null ?? (print "PHP >= 7.0 required yours is ".phpversion() . "\n") . exit(1);
Comme vous pouvez le constater, il existe de nombreuses manières d’obtenir exactement le même résultat. Cela s'applique non seulement à cet exemple if
, mais il en est de même avec structure/loop/function
. Il n’ya donc pas de réponse unique à votre grande question. On devrait envisager principalement de suivre.
J'oublie les accolades dans mes modèles PHP. Par exemple. vous pouvez utiliser des boucles comme suit:
<ul>
<?php foreach ($var as $value): ?>
<li><?php echo $value; ?></li>
<?php endforeach; ?>
</ul>
Vous pouvez l'utiliser pour des choses simples comme:
if($a === true) continue;
Mais pour certaines sous-conditions plus complexes, cela peut vous causer des problèmes:
$a = false;
$b = false;
if ($a === true)
if ($b === true)
echo 1;
else
echo 2;
Avec le code ci-dessus, vous vous attendez à voir "2" en sortie, mais ce n'est pas le cas.
Pour les déclarations d'une seule ligne.
Si vous avez essayé de faire
foreach($array as $x => $y)
$do_something = $x;
$do_something_else = $y;
Sauf erreur de ma part, l'interprète php prendra la deuxième ligne sous la déclaration foreach comme étant en dehors des accolades implicites
En raison de l’indentation, si vous reveniez plus tard à ce code, ou si un autre développeur avait examiné votre travail, il serait déroutant.
En tant que tel, il est généralement sage de toujours utiliser des accolades avec ces instructions. Cela évitera plus tard maux de tête/confusion
Pour compléter la réponse de @Marko , sachez que lors de l'utilisation de l'opérateur point, vous devez placer chaque opération entre parenthèses, faute de quoi l'ordre sera inversé.
Par exemple, ce code ci-dessous imprimera PHP >= 7.0 required yours is 5.6.15
.
(print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n");
Tandis que ceci imprimera 5.6.151PHP >= 7.0 required yours is 1
.
print("PHP >= 7.0 required yours is ") . print(phpversion()) . print("\n");
Vous pouvez également utiliser l'opérateur and
pour que cela fonctionne. Ainsi:
if (PHP_VERSION_ID < 70000)
print("PHP >= 7.0 required yours is ") and
print(phpversion()) and
print("\n");
La réponse est facile. C'est la même chose en C/C++.
if, if/else, if/else if/else et boucles => Si l'instruction suivante est une seule ligne, vous pouvez omettre les accolades.
Ex:
for($i= 0; $i<=100; $i++)
{
if($i % 7 == 0)
{
echo $i . "<br>";
}
}
Il peut aussi être écrit de cette façon:
for($i= 0; $i<=100; $i++) if($i % 7 == 0) echo $i . "<br>";
C'est possible quand vous n'avez qu'une expression après votre clause /
Par exemple,
foreach($var as $value)
if(1 + 1 == 2) {
$arr[] = $value;
};
est correct, mais
foreach($var as $value)
$somevar = $var;
if(1 + 1 == 2) {
$arr[] = $value;
};
n'est pas, et l'interprète php pensera que l'instruction if
est à l'extérieur foreach
Quand puis-je omettre les accolades et dans quelle structure/boucle/fonction? Je sais que je peux certainement le faire dans et si. Mais qu'en est-il tandis que pour et pour chaque?
Pour If/else, il est possible d'avoir single et multiple instructions sans accolades en utilisant la construction suivante:
<?php
if ($x):
echo 'foo';
echo 'bar';
else:
echo 'nofoo';
echo 'nobar';
endif;
?>
Comme décrit dans cette réponse
Pour while, for et foreach, seules les instructions single sont autorisées sans accolades.
<?php
foreach($array as $x => $y)
$do_something = $x;
?>
L'expression abrégée PHP était disponible depuis PHP 5.3
$condition ? $value_if_true : $value_if_false
$a ? $b : ( $c ? $d : ( $e ? $f : $g ) )