Différence entre if () {} et if (): endif;

159

Y a-t-il des différences entre ...

if ($value) {

}

...et...

if ($value):

endif;

?

Alex
la source
La deuxième méthode existe depuis PHP4, sinon plus tôt.
Miles
1
La plupart des réponses n'abordent pas vraiment le point principal : qu'est -ce qui fonctionne mieux lorsque vous regardez du code et qu'il y a beaucoup de commandes de fermeture telles que } } } }(qui peut être fait avec endifaussi) et que vous voulez savoir où elles étaient ouvertes? La réponse n'est ni l'un ni l'autre . C'est fondamentalement la première "règle" des principes de conception python .
cregox
7
De toute évidence, {}c'est mieux et : endif;c'est une atrocité qui n'existerait pas si la vie était juste. Avec un bon éditeur de texte, vous aurez un raccourci clavier pour faire correspondre les crochets, pour vous faire passer de l'ouverture à la fermeture ou vice versa. Rien de tel n'existe ni ne pourrait jamais exister pour la : endif;syntaxe hideuse .
developerwjk
3
@developerwjk comment cela pourrait-il ne jamais exister?
alex

Réponses:

177

Ce sont les mêmes mais le second est génial si vous avez MVC dans votre code et que vous ne voulez pas avoir beaucoup d'échos dans votre code. Par exemple, dans mes .phtmlfichiers (Zend Framework), j'écrirai quelque chose comme ceci:

<?php if($this->value): ?>
Hello
<?php elseif($this->asd): ?>
Your name is: <?= $this->name ?>
<?php else: ?>
You don't have a name.
<?php endif; ?>
Thomaschaaf
la source
38
@alex Cela fonctionnera également avec les accolades, mais au moins personnellement, je trouve cette méthode plus claire dans des choses comme celle-ci. Parce qu'ils vous savent que c'est la fin d'un si, et non la fin d'une boucle d'une sorte ou de quelque chose d'autre. Pensez que vous avez une fin pour et une fin ou quelque chose de similaire aussi.
Svish
10
Je n'utiliserais pas le <? =?> Car il n'est pas pris en charge sur tous les serveurs, en particulier ceux d'hébergement partagé qui ne vous permettent pas de changer php.ini.
Siqi Lin
2
Le point pertinent est <? Php endif; ?> - vous pouvez dire exactement ce qui se termine même avec de nombreuses lignes de HTML entre le if / else précédent et cette instruction.
Fenton
7
pourquoi "le second est génial si vous ne voulez pas avoir beaucoup d'échos dans votre code"? Je pense qu'il en va de même pour la syntaxe traditionnelle {}. Aucun écho supplémentaire n'est nécessaire <?php if(...){ ?> ... <?php }else{ ?> ... <?php } ?>. Quelle est la différence avec <?php if(...): ?> ... <?php else: ?> ... <?php endif ?>?
Sithu
9
Je ne sais pas pourquoi cette réponse est la plus élevée, car ce n'est pas un bon exemple (vous pouvez obtenir exactement la même chose avec des accolades).
Reinier Kaper
69

Personnellement, je déteste vraiment la syntaxe alternative. Une bonne chose à propos des accolades est que la plupart des IDE, vim, etc. ont tous une mise en évidence de parenthèses. Dans mon éditeur de texte, je peux double-cliquer sur une accolade et cela mettra en évidence le morceau entier afin que je puisse voir où il se termine et commence très facilement.

Je ne connais pas un seul éditeur qui puisse mettre en évidence endif, endforeach, etc.

dépréviter
la source
11
Ceci est censé être utilisé dans les modèles PHP, où le début et la fin du bloc sont séparés par un morceau de langue étrangère. Si votre IDE comprend assez bien PHP pour analyser cela, il doit également être mis endifen évidence correctement en tant que fin de bloc. Si ce n'est pas le cas, vous n'achetez vraiment rien en utilisant }car il ne correspondra pas de toute façon.
Pavel Minaev
2
La plupart des idées (du moins celles que j'ai utilisées) ne mettent en évidence que {}
AntonioCS
11
Netbeans 7.x met joyeusement en évidence les correspondances endforeach, endif, etc.
Jonathan Day
@Monsieur. Minaev: Le matcher d'accolades analysera correctement probablement dans 98% des cas, même s'il y a du code étranger à l'intérieur. Il n'échouera que s'il y a une accolade ézotérique "code d'ouverture mais pas de fermeture" à l'intérieur. Oui, cela arrive, mais cela arrive rarement. Pourquoi pensez-vous qu'une «fin-peu importe» complexe; approche parseur fera mieux pratiquement, que la solution simple?
PatlaDJ
Je pense que le point le plus important est d' être descriptif , au besoin. Ainsi, nous pouvons facilement trouver où il était ouvert, quel que soit l'outil que nous pourrions avoir besoin d'utiliser. Particulièrement vrai pour PHP, que vous devez de temps en temps voir en utilisant les éditeurs les plus simplistes.
cregox
49

Je pense que cela dit tout:

cette syntaxe alternative est excellente pour améliorer la lisibilité (à la fois pour PHP et HTML!) dans les situations où vous en avez un mélange.

http://ca3.php.net/manual/en/control-structures.alternative-syntax.php

Lorsque vous mélangez HTML et PHP, la syntaxe alternative est beaucoup plus facile à lire. Dans les documents PHP normaux, la syntaxe traditionnelle doit être utilisée.


la source
7
+1, belle réponse sur son objectif. Personnellement, je pense que c'est un ajout inutile à une langue déjà encombrée.
Draemon
29

Dans notre entreprise, la manière préférée de gérer le HTML est:

<? if($condition) { ?>
   HTML content here
<? } else { ?>
   Other HTML content here
<? } ?>

En fin de compte, il s'agit vraiment d'en choisir un et de s'y tenir.

gahooa
la source
Merci - J'ai mis à jour cette réponse. Il tourne un peu autour du pot, mais peut aider.
gahooa
De qui voulez-vous dire quand vous dites «notre»?
Oddthinking
+1 pour éviter les déclarations d'écho excessives et les guillemets échappés. :)
John McCollum
ERREUR:<?php if(TRUE){?> test <?php }?> <?php else{ ?> test2 <?php }?>
Yousha Aleayoub
13

Ils sont en effet tous les deux identiques, fonctionnellement.

Mais si le endifcorrespondant s'éloigne trop du correspondant, ifje pense qu'il est préférable de lui faire un commentaire de référence. Juste pour que vous puissiez facilement trouver où il était ouvert. Quelle que soit la langue utilisée:

if (my_horn_is_red or her_umbrella_is_yellow)
{

    // ...

    // let's pretend this is a lot of code in the middle

    foreach (day in week) {
        sing(a_different_song[day]);
    }

    // ...

} //if my_horn_is_red

Cela s'applique en fait à toute "chose de clôture" analogue! ;)

De plus, en général, les éditeurs traitent mieux les accolades, dans le sens où ils peuvent vous indiquer où il était ouvert. Mais même cela ne rend pas les commentaires descriptifs moins valables.

cregox
la source
1
d'accord, c'est beaucoup mieux - au lieu de taper endif - vous pouvez dire ce que fait réellement la condition if.
cartalot
@cartalot serait peut-être même bien d'avoir intégré le langage (comme argument optionnel de fermeture de bloc nommé), donc nous pourrions avoir des erreurs pour fermer les mauvais blocs aux mauvais endroits! :)
cregox
9

Je pense que c'est particulièrement clair lorsque vous utilisez un mélange de ifs, fors et foreaches dans les scripts de vue:

<?php if ( $this->hasIterable ): ?>
    <h2>Iterable</h2>
    <ul>
    <?php foreach ( $this->iterable as $key => $val ):?>
        <?php for ( $i = 0; $i <= $val; $i++ ): ?>
        <li><?php echo $key ?></li>
        <?php endfor; ?>
    <?php endforeach; ?>
    </ul>
<?php elseif ( $this->hasScalar ): ?>
    <h2>Scalar</h2>
    <?php for ( $i = 0; $i <= $this->scalar; $i++ ): ?>
    <p>Foo = Bar</p>
    <?php endfor; ?>
<?php else: ?>
    <h2>Other</h2>
    <?php if ( $this->otherVal === true ): ?>
    <p>Spam</p>
    <?php else: ?>  
    <p>Eggs</p>  
    <?php endif; ?>
<?php endif; ?>

par opposition à:

<?php if ( $this->hasIterable ){ ?>
    <h2>Iterable</h2>
    <ul>
    <?php foreach ( $this->iterable as $key => $val ){?>
        <?php for ( $i = 0; $i <= $val; $i++ ){ ?>
        <li><?php echo $key ?></li>
        <?php } ?>
    <?php } ?>
    </ul>
<?php } elseif ( $this->hasScalar ){ ?>
    <h2>Scalar</h2>
    <?php for ( $i = 0; $i <= $this->scalar; $i++ ){ ?>
    <p>Foo = Bar</p>
    <?php } ?>
<?php } else { ?>
    <h2>Other</h2>
    <?php if ( $this->otherVal === true ){ ?>
    <p>Spam</p>
    <?php } else { ?>  
    <p>Eggs</p>  
    <?php } ?>
<?php } ?>

Ceci est particulièrement utile pour les instructions de contrôle longues où vous ne pourrez peut-être pas voir la déclaration du haut depuis l'accolade inférieure.

Harry Mustoe-Playfair
la source
7

Je pense que cela dépend vraiment de votre style de codage personnel. Si vous êtes habitué à C ++, Javascript, etc., vous vous sentirez peut-être plus à l'aise avec la syntaxe {}. Si vous êtes habitué à Visual Basic, vous souhaiterez peut-être utiliser if: endif; syntaxe.

Je ne suis pas sûr que l'on puisse définitivement dire que l'un est plus facile à lire que l'autre - c'est une préférence personnelle. Je fais généralement quelque chose comme ça:

<?php
if ($foo) { ?>
   <p>Foo!</p><?php
} else { ?>
   <p>Bar!</p><?php
}  // if-else ($foo) ?>

Que ce soit plus facile à lire que:

<?php
if ($foo): ?>
   <p>Foo!</p><?php
else: ?>
   <p>Bar!</p><?php
endif; ?>

est une question d'opinion. Je peux voir pourquoi certains penseraient que la deuxième méthode est plus facile - mais seulement si vous n'avez pas programmé en Javascript et C ++ toute votre vie. :)

livefree75
la source
1
Non, les crochets sont objectivement plus faciles à lire (lorsque vous n'utilisez pas la version égyptienne). Même si vous faites les crochets de telle sorte qu'ils marchent comme un égyptien, c'est plus facile à lire que la syntaxe VB car les éditeurs de texte modernes auront une fonction de correspondance entre crochets pour vous emmener de l'ouverture à la fermeture du crochet ou vice versa. Il n'y a aucun moyen qu'ils puissent avoir une fonction de correspondance de syntaxe VB. Vous devez également tenir compte de l'imbrication, et VB échoue lamentablement sur ce point.
developerwjk
5

J'utiliserais la première option si possible, quelle que soit la nouvelle option. La syntaxe est standard et tout le monde la connaît. Il est également rétrocompatible.

Paulo
la source
5

Les deux sont identiques.

Mais: si vous souhaitez utiliser PHP comme langage de modélisation dans vos fichiers de vue (le V de MVC), vous pouvez utiliser cette syntaxe alternative pour distinguer le code php écrit pour implémenter la logique métier (parties Controller et Model de MVC) et gui- logique. Bien sûr, ce n'est pas obligatoire et vous pouvez utiliser la syntaxe de votre choix.

ZF utilise cette approche.

Itay Moav -Malimovka
la source
5

Il n'y a pas de différence technique entre les deux syntaxes. La syntaxe alternative n'est pas nouvelle; il était supporté au moins aussi loin que PHP 4, et peut-être même plus tôt.

Vous pourriez préférer la forme alternative car elle indique explicitement la structure de contrôle qui se termine: endwhilepar exemple, ne peut terminer qu'un whilebloc, alors que si vous rencontrez une accolade, cela pourrait fermer n'importe quoi.

Vous préférerez peut-être la syntaxe traditionnelle, cependant, si vous utilisez un éditeur qui a un support spécial pour les accolades dans d'autres syntaxes de type C. Vim, par exemple, prend en charge plusieurs frappes pour naviguer vers les accolades correspondantes et vers les débuts et les fins de blocs délimités par des accolades. La syntaxe alternative briserait cette fonctionnalité de l'éditeur.

Rob Kennedy
la source
3

En fin de compte, vous ne voulez tout simplement pas chercher la ligne suivante et ensuite deviner où elle a commencé:

<?php } ?>

Techniquement et fonctionnellement, ils sont identiques.

Bondt
la source
1
Un bon éditeur de texte aura un raccourci correspondant aux crochets pour vous emmener là où il a commencé. Il endif;sera difficile de trouver le début, car ils n'auront pas de fonction similaire pour cela, et le code de style VB ne s'emboîte pas bien.
developerwjk
3

Tout dépend, personnellement je préfère la syntaxe traditionnelle avec des échos et beaucoup d'indentations, car c'est tellement plus facile à lire.

<?php
    if($something){
        doThis();
    }else{
        echo '<h1>Title</h1>
            <p>This is a paragraph</p>
            <p>and another paragraph</p>';
    }
?>

Je suis d'accord que la syntaxe alt est plus propre avec les différentes clauses de fin, mais j'ai vraiment du mal à les gérer sans l'aide de la mise en évidence de l'éditeur de texte, et je ne suis tout simplement pas habitué à voir du code "condensé" comme celui-ci:

<?php if( $this->isEnabledViewSwitcher() ): ?>
<p class="view-mode">
    <?php $_modes = $this->getModes(); ?>
    <?php if($_modes && count($_modes)>1): ?>
    <label><?php echo $this->__('View as') ?>:</label>
    <?php foreach ($this->getModes() as $_code=>$_label): ?>
        <?php if($this->isModeActive($_code)): ?>
            <strong title="<?php echo $_label ?>" class="<?php echo strtolower($_code); ?>"><?php echo $_label ?></strong>&nbsp;
        <?php else: ?>
            <a href="<?php echo $this->getModeUrl($_code) ?>" title="<?php echo $_label ?>" class="<?php echo strtolower($_code); ?>"><?php echo $_label ?></a>&nbsp;
        <?php endif; ?>
    <?php endforeach; ?>
    <?php endif; ?>
</p>
<?php endif; ?>
Yi Yang
la source
2

J'avais l'habitude d'utiliser les accolades, mais maintenant, je préfère utiliser cette syntaxe alternative abrégée en raison de la lisibilité et de l'accessibilité du code.


la source
Je l'utilise dans mes modèles de vue.
alex
2

Personnellement, je préfère le faire en deux sections séparées mais dans le même PHP comme:

<?php 
    if (question1) { $variable_1 = somehtml; }
    else { $variable_1 = someotherhtml; } 

    if (question2) {
        $variable_2 = somehtml2;
    }

    else { 
        $variable_2 = someotherhtml2;
    }         

etc.
$output=<<<HERE
htmlhtmlhtml$variable1htmlhtmlhtml$varianble2htmletcetcetc
HERE;
echo $output;

?>

Mais c'est peut-être plus lent?

Henrik
la source
1

Je pense que c'est une question de préférence. J'utilise personnellement:

if($something){
       $execute_something;
}
Sergio Rodriguez
la source
1
si vous lisez tout le fil de discussion: une syntaxe alternative est préférée et beaucoup <em> plus propre </em> lors de la création de modèles ou de l'utilisation d'une langue étrangère dans les vues php
Juraj Blahunka
1

J'utilisais des accolades pour les conditions "if, else". Cependant, j'ai trouvé "if (xxx): endif;" est plus sémantique si le code est fortement enveloppé et plus facile à lire dans tous les éditeurs.

Bien sûr, les éditeurs de lots sont capables de reconnaître et de mettre en évidence des morceaux de code lorsque des accolades sont sélectionnées. Certains fonctionnent également bien sur la paire "if (xxx): endif" (par exemple, NetBeans)

Personnellement, je recommanderais "if (xxx): endif", mais pour un petit contrôle de condition (par exemple, une seule ligne de code), il n'y a pas beaucoup de différences.

Aaron Chen
la source
1

Je pense qu'aucune des réponses préexistantes n'identifie pleinement la réponse ici, alors je vais articuler ma propre perspective. Fonctionnellement, les deux méthodes sont les mêmes. Si le programmeur est familier avec d'autres langages suivant la syntaxe C, alors il se sentira probablement plus à l'aise avec les accolades, ou bien si php est le premier langage qu'ils apprennent, ils se sentiront plus à l'aise avec la if endifsyntaxe, car elle semble plus proche à la langue ordinaire.

Si vous êtes un programmeur vraiment sérieux et que vous avez besoin de faire les choses rapidement, je pense que la syntaxe entre accolades est supérieure car elle permet de gagner du temps lors de la saisie.

if(/*condition*/){
    /*body*/ 
}

par rapport à

if(/*condition*/):
    /*body*/
endif;

Cela est particulièrement vrai avec d'autres boucles, par exemple, une foreachoù vous finiriez par taper 10 caractères supplémentaires. Avec les accolades, il vous suffit de taper deux caractères, mais pour la syntaxe basée sur les mots-clés, vous devez taper un mot-clé supplémentaire complet pour chaque boucle et instruction conditionnelle.

Andrew
la source