web-dev-qa-db-fra.com

PHP - Si/sinon, pour, chaque, alors - sans accolades?

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.

46
headacheCoder

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.)

77
KingCrunch

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. 

27
tkone

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;
10
site stats

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: 

  1. PHP Structures de contrôle
  2. Les opérateurs conditionnels ternaires PHP et les expressions en général

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.

  1. Le code que vous écrivez est-il facile à maintenir?.
  2. Pouvez-vous répondre vous-même si vous gagnez quelque chose en omettant les accolades.
5
mkungla

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>
3
Georg Leber

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.

2
Iliya Kolev

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

1
Pete Mitchell

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");
1
Renan Decarlo

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>";
0
AlexPac

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

0
nikans

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;
?>
0
Duffmannen

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 ) )
0
Midhun1993