web-dev-qa-db-fra.com

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

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

if ($value) {

}

...et...

if ($value):

endif;

?

151
alex

Ils sont identiques, 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 fichiers .phtml (Zend Framework), je vais écrire 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; ?>
168
Thomaschaaf

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

Je ne connais aucun éditeur capable de mettre en évidence endif, endforeach, etc.

66
dprevite

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 une combinaison.

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

En mélangeant HTML et PHP, l'alternative sytnax est beaucoup plus facile à lire. Dans les documents PHP normaux, la syntaxe traditionnelle doit être utilisée.

45
Olaf

Dans notre entreprise, la manière privilégié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.

28
gahooa

Ils sont en effet les mêmes, fonctionnellement.

Mais si la endif s’éloigne trop du correspondant if, je pense que c’est bien mieux de donner un commentaire de référencement à celle-ci. Juste pour que vous puissiez facilement trouver où il était ouvert. Peu importe la langue:

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 à n'importe quelle "chose de clôture" analogue! ;)

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

12
cregox

Voici où vous pouvez le trouver dans la documentation officielle: PHP: Autre syntaxe pour les structures de contrôle

11
Jeremy Ruten

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 dans lesquelles vous ne pourrez peut-être pas voir la déclaration du haut à partir de l'accolade du bas.

8

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

Je ne suis pas sûr que l’on puisse vraiment affirmer qu’un est plus facile à lire que l’autre - c’est sa préférence personnelle. Je fais habituellement 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 pensent que la deuxième méthode est plus facile - mais seulement si vous n’avez pas programmé en Javascript et C++ toute votre vie. :)

7
livefree75

J'utiliserais la première option si possible, quelle que soit la nouvelle option. La syntaxe est standard et tout le monde le sait. C'est aussi rétrocompatible.

5
Paulo

Les deux sont les mêmes.

Mais si vous voulez utiliser PHP comme langage de template 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 Contrôleur et Modèle). de MVC) et gui-logic. Bien sûr, ce n’est pas obligatoire et vous pouvez utiliser la syntaxe de votre choix.

ZF utilise cette approche.

5
Itay Moav -Malimovka

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 longtemps que PHP 4, et peut-être même plus tôt.

Vous pouvez préférer la forme alternative car elle indique explicitement quelle structure de contrôle se termine: endwhile, par exemple, ne peut terminer qu'un bloc while, alors que si vous rencontrez une accolade, elle pourrait tout fermer.

Toutefois, vous pouvez préférer la syntaxe traditionnelle si vous utilisez un éditeur prenant en charge les accolades dans d'autres syntaxes analogues à celles du C. Vim, par exemple, prend en charge plusieurs séquences de touches pour naviguer vers les accolades correspondantes, ainsi que pour le début et la fin des blocs délimités par des accolades. La syntaxe alternative briserait cette fonctionnalité de l'éditeur.

5
Rob Kennedy

Tout dépend, personnellement, je préfère la syntaxe traditionnelle avec des échos et de nombreuses indentations, car elle 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 conviens 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 surbrillance de l'éditeur de texte, et je ne suis tout simplement pas habitué à voir un 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; ?>
3
Yi Yang

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.

2
Bondt

J'avais l'habitude d'utiliser des accolades, mais certains jours, je préfère utiliser cette syntaxe alternative simpliste en raison de la lisibilité du code et de son accessibilité.

2
Shahriat Hossain

Personnellement, je préfère le faire en deux sections distinctes 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 peut-être est-ce plus lent?

2
henrik

Je pense qu'aucune des réponses préexistantes n'identifie complètement la réponse ici, alors je vais exprimer ma propre perspective. Fonctionnellement, les deux méthodes sont les mêmes. Si le programmeur est familier avec les autres langages qui suivent la syntaxe C, il se sentira probablement plus à l'aise avec les accolades. Sinon, si php est la première langue qu'il apprend, il se sentira plus à l'aise avec le ifendif syntaxe, car elle semble plus proche du langage courant.

Si vous êtes un programmeur très sérieux et que vous avez besoin de choses rapidement, je suis convaincu que la syntaxe entre accolades est supérieure car elle permet de gagner du temps en tapant

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

par rapport à

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

Ceci est particulièrement vrai avec d'autres boucles, par exemple un foreach où vous finissez par taper 10 caractères supplémentaires. Avec des 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 pour chaque boucle et chaque instruction conditionnelle.

1
Andrew

J'avais l'habitude d'utiliser des accolades pour les conditions "si, sinon". Cependant, j'ai trouvé "if (xxx): endif;" est plus sémantique si le code est fortement encapsulé et plus facile à lire dans tous les éditeurs.

Bien entendu, 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 font aussi bien sur la paire "if (xxx): endif" (par exemple, NetBeans)

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

1
Aaron Chen

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

if($something){
       $execute_something;
}
1
Sergio Rodriguez