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.

44
demandé sur Cœur 2012-01-04 15:45:38

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)

75
répondu KingCrunch 2013-09-14 00:50:45

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.

25
répondu tkone 2012-01-04 11:51:30

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;
10
répondu site stats 2012-01-04 12:46:37

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

  1. structures de contrôle PHP
  2. 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.

  1. est le code que vous écrivez facile à maintenir.
  2. Pouvez-vous répondre à votre auto est-il quelque chose que vous gagnez en omettant d'accolades.
5
répondu M.Kungla 2016-01-25 20:04:50

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>
3
répondu Georg Leber 2012-01-04 11:51:26

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.

2
répondu Iliya Kolev 2015-05-21 08:03:12

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

1
répondu Pete Mitchell 2012-01-04 11:49:12

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");
1
répondu Renan Decarlo 2017-05-23 12:34:29

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

0
répondu nikans 2012-01-04 11:48:13

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>";
0
répondu AlexPac 2015-04-21 10:46:30

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;
?>
0
répondu Duffmannen 2018-08-08 11:15:00

PHP shorthand expression était disponible depuis PHP 5.3

$condition ? $value_if_true : $value_if_false

$a ? $b : ( $c ? $d : ( $e ? $f : $g ) )
0
répondu Midhun1993 2018-09-19 10:06:01