PHP If/else, for, foreach, tandis que - sans accolades?
Quelque chose que voudrais vraiment savoir, mais jamais trouvé sont des raccourcis dans PHP.
Je suis actuellement en train de coder une fonction avec un foreach
boucle avec juste une seule déclaration, à l'intérieur. J'ai essayé d'omettre les accolades comme vous pouvez le faire en si/d'autre structures de contrôle et il fonctionne. Pas d'erreurs.
foreach($var as $value)
$arr[] = $value;
Maintenant, j'ai essayé de l'utiliser de la même manière, mais de mettre un if/else bloc à l'intérieur. Encore une fois, de travail et pas d'erreurs.
foreach($var as $value)
if(1 + 1 == 2) {
$arr[] = $value;
};
Puis, j'ai pensé comme "pourquoi est-ce?" et omis la fermeture de point-virgule. Encore de travail. J'ai donc essayé d'utiliser les if/else sans accolades à l'intérieur de la boucle foreach et encore, encore de travail et pas d'erreurs. Mais la boucle foreach vraiment fermé/terminé maintenant?
foreach($var as $value)
if(1 + 1 == 2)
$arr[] = $value;
Au moins, j'ai omis la fermeture de point-virgule à nouveau et (comme prévu) une erreur d'analyse s'est produite.
Donc ma grande question est: Quand puis-je omettre les accolades et dans lequel la structure/boucle/fonction? Je sais que je peux certainement le faire dans if
et else
. Mais qu'en est while
, for
et foreach
?
Et oui, je sais qu'il n'est pas sûr, intelligent, que ce soit pour le code, sans accolades et il y a des abréviations comme $condition ? true : false;
et if: doSomething(); endif;
, endfor;
et endforeach;
. Je ne veux pas apprendre à propos des abréviations, je veux juste comprendre les conditions au sujet de quand et où il est possible d'omettre les accolades.
- Par ailleurs, il n'est pas nécessaire de mettre un point-virgule après l'accolade fermante. La syntaxe de la signification de cela est l'ajout d'une instruction vide entre eux. Cela est vrai de tous les C-comme les langues, sauf pour les déclarations de
struct
etclass
en C et C++. - Vous avez besoin d'apprendre la différence entre les déclarations et les expressions pour comprendre quand les curlys sont omittable. Et puis une bonne compréhension de l'expression de cohésion est nécessaire encore.
Vous devez vous connecter pour publier un commentaire.
Lorsque vous omettre les accolades, il ne traiter l'instruction suivante dans le corps de l'état.
est le même que
mais n'oubliez pas que
sera toujours imprimer "de la barre"
En interne, c'est l'inverse:
if
ne regarde à la prochaine expression, mais PHP traite tout ce qui dans{}
comme un seul "regroupées" expression.De même pour les autres instructions de contrôle (
foreach
, et ainsi de suite)do{}while($X);
, ou un interrupteur.for
,while
,foreach
etif
. Aussi il est comme ça pour toutes les langues, avec un C comme syntaxe. Note de @tkone réponse, sur la façon dont il est de Bonne Pratique de toujours utiliser des accolades.try-catch
? Parce queException
est une classe à la première place 😉 Oui, une syntaxe alternative pourtry-catch
simplement n'existe pas (ne sais pas si cela a une raison plus profonde, ou c'est juste "oublié").Il y a des endroits où vous pouvez, mais vous ne le devrait.
Explicite est toujours mieux qu'implicites.
Qui sait quand vous allez avoir à revenir en arrière et modifier de l'ancien code. C'est tellement facile de rater ce genre de choses et il n'y a rien de gagné par le faire.
Il fonctionnera correctement si vous n'avez qu'un seul argument à l'intérieur!. Mais si vous voulez omettre les accolades, vous pouvez utiliser du côlon et de fin.
exemple:
Comme ont dit, vous ne voulez pas apprendre la sténographie de l' et accepté réponse donne le bon exemple à propos de l'omission
curly braces
, mais il y a quelque chose à ajouter. Comme vous pouvez le voir c'est bien d'omettrecurly braces
en cas deif ($x) echo 'foo';
. Il n'y a rien de mal avec le code, pas de performance ou d'autres problèmes et qu'il est lisible par d'autres développeurs. Et l'exemple montre également que si vous écrivezau lieu de
Vous pouvez exécuter dans les résultats non souhaités où
bar
est imprimé alors que vous ne voulez pas qu'il soit imprimé et si votre code est plein de ces déclarations alors il sera plus difficile pour vous de lire votre propre code, et même de plus en plus difficile pour les autres de le lire.Ces choses sont étroitement liées, de sorte que si vous voulez vraiment comprendre où il est possible d'omettre les accolades alors que ce devrait être un must que vous comprendre ou sont au moins au courant de la sténographie de l' , avoir lu
De l'accolade n'est toutefois pas nécessaire, pour des raisons de lisibilité et de la maintenance, de nombreux développeurs considère qu'il serait mauvais de style de ne pas l'inclure. Précédent 2 liens qui devraient vous donner l'information nécessaire pour prendre vos propres décisions quand vous pourriez omettre les accolades.
par exemple il n'y a rien de mal avec les extraits de code suivants, qui tous faire exactement la même chose.
Avec accolade
Est la même que
Ou vous pouvez utiliser l'opérateur point
Et vous pouvez faire usage de l'opérateur conditionnel ternaire et même omettre
if
de soi en plus de l'omission des accoladesCar on a seulement l'impression que nous pouvons raccourcir et de la bande de certains
print string functions
qui étaient là pour représenter plus d'une fonction dans l'énoncé sans accoladesQu'à partir de php 7, nous pouvons utiliser la valeur Null coalescence opérateur
Comme on peut voir qu'il y a de nombreuses façons que vous pouvez obtenir exactement le même résultat. Qui ne s'applique pas seulement pour cette
if
exemple, mais la même chose peut être pratiqué avecstructure/loop/function
. Donc, il n'y a pas de réponse unique pour votre grande question. On doit considérer principalement les suivantes.$I_want_value = $if_im_not_null_use_me ?? $if_first_is_null_use_me ?? $if_second_is_null_use_me;
De sorte que Vous pouvez avoir autant d'alternatives que vous qui si la variable est NULL; PHP 7 Nouvelle-caractéristiquesJe omettre les accolades dans mes templates PHP. E. g. vous pouvez utiliser des boucles comme suit:
Vous pouvez l'utiliser pour des choses simples comme:
Mais pour un peu plus compliqué sous-conditions, elle peut vous causer des problèmes:
Avec le code ci-dessus, vous pouvez vous attendre à voir "2" comme sortie, mais vous ne serez pas.
Pour seule ligne consolidés.
Si vous avez essayé de faire
À moins que je me trompe, l'interprète php va prendre la deuxième ligne, en vertu de l'instruction foreach comme étant à l'extérieur de l'implicite accolades
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 de toujours utiliser des accolades avec ces déclarations. Il permettra d'économiser plus tard, les maux de tête/de la confusion
Pour compléter @Marko's réponse, sachez que lors de l'utilisation de l'opérateur point pour cette question, vous devez placer chaque opération entre parenthèses, sinon il va inverser l'ordre.
Par exemple, ce code ci-dessous impression
PHP >= 7.0 required yours is 5.6.15
.Bien que cette impression
5.6.151PHP >= 7.0 required yours is 1
.Vous pouvez également utiliser le
and
de l'opérateur pour que cela fonctionne. Comme:C'est possible si vous n'avez qu'une expression à la suite de votre article/
Par exemple,
est correct, mais
n'est pas, et php interprète pense que
if
déclaration est en dehors deforeach
La réponse est facile. C'est la même chose en C/C++.
si, if/else if/else if/else et boucle => Si l'instruction suivante est une seule ligne, vous pouvez omettre les accolades.
Ex:
Il peut aussi être écrit de cette manière:
Pour Si/d'autre il est possible d'avoir unique et plusieurs états sans accolades à l'aide de le construire:
Comme décrit dans cette réponse
Pour tout, pour et foreach, seulement unique déclarations sont autorisés, sans les accolades
PHP expression abrégée est disponible depuis PHP 5.3