PHP-If / else, foreach, while-with curly braces?
quelque chose qui voudrait vraiment savoir mais qui n'a jamais découvert que ce sont des raccourcis en PHP.
je suis en train de coder une fonction avec une boucle foreach
avec un seul énoncé à l'intérieur. J'ai essayé d'omettre les bagues bouclées comme vous pouvez le faire dans Si/sinon contrôler les structures et cela fonctionne. Pas d'erreurs.
foreach($var as $value)
$arr[] = $value;
maintenant j'ai essayé de l'utiliser de la même façon, mais en mettant un si/autre bloc à l'intérieur. Encore une fois, le travail et pas d'erreurs.
foreach($var as $value)
if(1 + 1 == 2) {
$arr[] = $value;
};
alors, je me suis dit: "Pourquoi ça marche?"et omit le point-virgule de fermeture. Encore de travail. Donc j'ai essayé d'utiliser la déclaration if/else sans lacets bouclés à l'intérieur de la boucle de foreach et encore, toujours en fonctionnement et aucune erreur. Mais la boucle foreach vraiment fermé/terminé maintenant?
foreach($var as $value)
if(1 + 1 == 2)
$arr[] = $value;
j'ai au moins omis de nouveau le point-virgule de fermeture et (comme prévu) une erreur d'analyse s'est produite.
ainsi ma grande question Est: Quand peut J'Omets les bagues bouclées et dans quelle structure/boucle/fonction? Je sais que je peux certainement le faire dans if
et else
. Mais qu'en est-il de while
, for
et foreach
?
et oui, je sais qu'il n'est pas sûr, intelligent, quoi que ce soit à coder sans bretelles bouclées et il ya 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 juste comprendre les conditions de quand et où il est possible d'omettre les accolades.
12 réponses
quand vous omettez les bretelles, il ne traitera la déclaration suivante 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 imprimer "de la barre"
en interne c'est l'inverse: if
ne regardera que la prochaine expression, mais PHP traite tout dans {}
comme un seul" groupé" expression.
idem pour les autres déclarations de contrôle ( foreach
, et ainsi de suite)
il y a des endroits où vous pouvez, mais vous ne devriez jamais.
explicite est toujours mieux qu'implicite.
qui sait quand vous devrez revenir en arrière et modifier l'ancien code. C'est si facile de rater ça et ça n'a rien à y gagner.
Il fonctionnera correctement si vous n'avez qu'un seul argument à l'intérieur!. Mais si vous voulez omettre curly brace, vous pouvez utiliser colon et end. exemple:
if(a < 1 ) :
echo "a is less than 1";
else :
echo "a is greater than 1";
endif;
comme vous l'avez dit , vous ne voulez pas en savoir plus sur le de shorthand et la réponse acceptée donne un bon exemple de l'omission de curly braces
, mais il y a quelque chose à ajouter. Comme vous pouvez le voir, il est bien d'omettre curly braces
dans le cas de if ($x) echo 'foo';
. Il n'y a rien de mal avec le code, Aucune performance ou d'autres questions et il est lisible par d'autres développeurs. Et l'exemple vous montre aussi que si vous écrivez
if ($x)
echo 'foo';
echo 'bar';
au lieu de
if ($x)
echo 'foo';
echo 'bar';
vous pouvez courir dans des résultats indésirables où bar
est imprimé alors que vous ne voulez pas qu'il soit imprimé et si votre code est plein de telles déclarations alors il sera plus difficile pour vous de lire votre propre code et encore plus difficile pour les autres de le lire.
Je ne veux pas en savoir plus sur les raccourcis je veux juste comprendre les conditions sur quand et où il est possible d'omettre les crochets bouclés.
ces choses sont étroitement liées donc si vous voulez vraiment comprendre où il est possible d'omettre les crochets bouclés alors cela devrait être un must que vous comprenez ou au moins êtes au courant de shorthand's, ont lu
- structures de contrôle PHP
- Le PHP ternaire conditionnelle, les opérateurs et les expressions en général
Donc ma grande question Est: Quand puis-je omettre les bagues bouclées et dans quelle structure/boucle/fonction?
le corset Bouclé n'est pas nécessaire Cependant, pour la lisibilité et la maintenance, de nombreux développeurs considéreraient qu'il est de mauvais style de ne pas les inclure. Les 2 liens précédents devraient vous donner l'information nécessaire pour prendre vos propres décisions lorsque vous pourriez omettre curly brace. par exemple, il n'y a 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 point
if (PHP_VERSION_ID < 80000)
(print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n") . exit(1);
et vous pouvez faire usage de l'opérateur conditionnel ternaire et même omettre if
il en outre omettre lacets bouclés
(PHP_VERSION_ID > 70000) ?: (print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n") . exit(1);
puisque nous imprimons seulement nous pouvons raccourcir cela et rayer quelques print string functions
qui étaient ici pour représenter plus d'une fonction dans l'énoncé sans lacets bouclés
(PHP_VERSION_ID > 70000) ?: (print "PHP >= 7.0 required yours is " . phpversion() . "\n") . exit(1);
à 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 on peut le voir, il y a plusieurs façons d'obtenir exactement le même résultat. Cela s'applique non seulement pour cet exemple if
, mais il peut être pratiqué avec structure/loop/function
. Il n'y a donc pas de réponse unique à votre grande question . On devrait envisager principalement de suivre.
- est le code que vous écrivez facile à maintenir.
- Pouvez-vous répondre à votre auto est-il quelque chose que vous gagnez en omettant d'accolades.
j'Omets les accolades curly dans mes modèles PHP. E. g. 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 compliquées, il 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 vous ne le verrez pas.
pour les énoncés 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éteur php va prendre la deuxième ligne sous la déclaration foreach comme étant en dehors des accolades implicites
en Raison de l'indentation si vous revenez à ce code à une date ultérieure, ou un autre développeur regardé votre travail, il serait source de confusion.
en tant que tel, il est généralement Sage d'utiliser toujours accolades avec ces déclarations. Cela évitera plus tard les maux de tête/confusion
pour compléter la réponse de @Marko , soyez conscient que lorsque vous utilisez l'opérateur de point pour cette matière, vous devez inclure chaque opération entre parenthèses, sinon il inversera l'ordre.
par exemple, ce code ci-dessous affichera PHP >= 7.0 required yours is 5.6.15
.
(print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n");
alors 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. Comme:
if (PHP_VERSION_ID < 70000)
print("PHP >= 7.0 required yours is ") and
print(phpversion()) and
print("\n");
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éteur php pensera que if
déclaration est en dehors de foreach
la réponse est facile. C'est la même chose en C/C++.
si, 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>";
Quand puis-je omettre les broches bouclées et dans quelle structure/boucle/fonction? Je sais que je peux certainement le faire dans les if et else. Mais qu' alors que, for et foreach?
Pour if/else il est possible d'avoir unique et plusieurs déclarations sans accolades à l'aide de la construction:
<?php
if ($x):
echo 'foo';
echo 'bar';
else:
echo 'nofoo';
echo 'nobar';
endif;
?>
comme décrit dans cette réponse
pour tandis que , pour et pour , seuls déclarations simples sont autorisés sans crochets bouclés
<?php
foreach($array as $x => $y)
$do_something = $x;
?>
PHP shorthand expression était disponible depuis PHP 5.3
$condition ? $value_if_true : $value_if_false
$a ? $b : ( $c ? $d : ( $e ? $f : $g ) )