Differenza tra if () {} e if (): endif;


159

Ci sono differenze tra ...

if ($value) {

}

...e...

if ($value):

endif;

?


Il secondo modo esiste da PHP4, se non prima.
Miglia


1
La maggior parte delle risposte non affronta davvero il punto principale : quale funziona meglio quando si guarda un po 'di codice e ci sono molti comandi di chiusura come } } } }(che può essere fatto anche con endif) e vuoi sapere dove erano aperti? La risposta è nessuna delle due . Fondamentalmente è la prima "regola" dei principi di progettazione di Python .
Cregox,

7
Ovviamente {}è meglio ed : endif;è un'atrocità che non esisterebbe se la vita fosse giusta. Con un buon editor di testo avrai una scorciatoia da tastiera per abbinare le parentesi, per saltare dall'apertura alla chiusura o viceversa. Nessuna cosa del genere non esiste né potrebbe mai esistere per la : endif;sintassi orribile .
developerwjk,

3
@developerwjk come potrebbe non esistere mai?
alex,

Risposte:


177

Sono gli stessi, ma il secondo è fantastico se hai MVC nel tuo codice e non vuoi avere molti echi nel tuo codice. Ad esempio, nei miei .phtmlfile (Zend Framework) scriverò qualcosa del genere:

<?php if($this->value): ?>
Hello
<?php elseif($this->asd): ?>
Your name is: <?= $this->name ?>
<?php else: ?>
You don't have a name.
<?php endif; ?>

38
@alex Funzionerà anche con parentesi graffe, ma almeno personalmente trovo questo modo un po 'più chiaro in cose come questa. Perché sanno che è la fine di un if, e non la fine di un ciclo di qualche tipo o qualcos'altro. Pensa di avere endfor e endwhile o anche qualcosa di simile.
Svish,

10
Non userei <? =?> Perché non è supportato su tutti i server, specialmente quelli di hosting condiviso che non ti permettono di cambiare php.ini.
Siqi Lin,

2
Il punto pertinente è <? Php endif; ?> - puoi dire esattamente cosa sta finendo anche con molte righe di HTML tra if / else precedente e questa affermazione.
Fenton,

7
perché "il secondo è fantastico se non vuoi avere molti echi nel tuo codice"? Penso che sia lo stesso anche per la sintassi tradizionale {}. Non è necessaria alcuna eco aggiuntiva <?php if(...){ ?> ... <?php }else{ ?> ... <?php } ?>. Qual è la differenza con <?php if(...): ?> ... <?php else: ?> ... <?php endif ?>?
Sithu,

9
Non sono sicuro del perché questa risposta sia la più alta, in quanto non è un ottimo esempio (puoi ottenere lo stesso risultato con le parentesi graffe).
Reinier Kaper,

69

Personalmente odio davvero la sintassi alternativa. Una cosa bella delle parentesi graffe è che la maggior parte degli IDE, vim, ecc. Hanno tutti l'evidenziazione delle parentesi. Nel mio editor di testo posso fare doppio clic su una parentesi graffa ed evidenzierà l'intero pezzo in modo da poter vedere dove finisce e inizia molto facilmente.

Non conosco un singolo editor in grado di evidenziare endif, endforeach, ecc.


11
Questo dovrebbe essere usato nei template di PHP, dove l'inizio e la fine del blocco sono separati da un pezzo di lingua straniera. Se il tuo IDE comprende PHP abbastanza bene per analizzarlo, dovrebbe anche evidenziare endifcorrettamente come fine del blocco. In caso contrario, non si acquista nulla utilizzando }in quanto non corrisponderà comunque.
Pavel Minaev,

2
La maggior parte degli ide (almeno quelli che ho usato) evidenziano solo {}
AntonioCS,

11
Netbeans 7.x evidenzia felicemente la corrispondenza tra endforeach, endif, ecc.
Jonathan Day

@Sig. Minaev: il matcher del controvento analizzerà correttamente probabilmente nel 98% dei casi, anche se al suo interno è presente un codice esterno. Fallirà solo quando al suo interno è presente un controvento ezoterico "codice di apertura ma non di chiusura". Sì, succede, ma succede solo raramente. Perché pensi che un "fine-qualunque" complesso; l'approccio più parser farà praticamente meglio della semplice soluzione?
PatlaDJ,

Penso che il punto più importante sia essere descrittivo , quando necessario. Quindi possiamo facilmente trovare dove era aperto, indipendentemente dallo strumento che potremmo aver bisogno di usare. Specialmente vero per PHP, che di tanto in tanto devi vedere usando gli editor più semplicistici.
Cregox,

49

Penso che questo dica tutto:

questa sintassi alternativa è eccellente per migliorare la leggibilità (sia per PHP che per HTML!) in situazioni in cui ne hai un mix.

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

Quando si mescolano HTML e PHP, sytnax alternativo è molto più facile da leggere. Nei normali documenti PHP dovrebbe essere usata la sintassi tradizionale.


7
+1, bella risposta su quale sia il suo scopo. Personalmente penso che sia un'aggiunta inutile a un linguaggio già disordinato.
Draemon,

29

Nella nostra azienda, il modo preferito di gestire l'HTML è:

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

Alla fine, si tratta davvero di sceglierne uno e attenersi ad esso.


Grazie - ho aggiornato questa risposta. Batte un po 'intorno al cespuglio, ma può dare una mano.
gahooa,

Chi intendi quando dici "nostro"?
Pensando in modo strano il

+1 per evitare dichiarazioni di eco eccessive e virgolette sfuggite. :)
John McCollum,

ERRORE:<?php if(TRUE){?> test <?php }?> <?php else{ ?> test2 <?php }?>
Yousha Aleayoub

13

Sono effettivamente entrambi uguali, funzionalmente.

Ma se endifsi sta allontanando troppo dal corrispondente ifpenso che sia molto meglio fare un commento di riferimento. Solo così puoi facilmente trovare dove era aperto. Non importa quale lingua sia:

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

Questo in realtà si applica a qualsiasi "cosa di chiusura" analoga! ;)

Inoltre, in generale, gli editor trattano meglio le parentesi graffe, nel senso che possono indicarti dove era aperto. Ma anche ciò non rende i commenti descrittivi meno validi.


1
d'accordo che questo è molto meglio - invece di scrivere endif - puoi dire cosa sta realmente facendo la condizione if.
cartalot,

@cartalot forse sarebbe anche bello averlo costruito nella lingua (come argomento facoltativo di chiusura del blocco dei nomi), quindi potremmo avere errori per chiudere blocchi sbagliati in posti sbagliati! :)
Cregox,


9

Penso che sia particolarmente più chiaro quando si utilizza un mix di ifs, fors ed foreaches negli script di visualizzazione:

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

al contrario di:

<?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 } ?>

Ciò è particolarmente utile per le dichiarazioni di controllo lunghe in cui potresti non essere in grado di vedere la dichiarazione superiore dalla parentesi graffa inferiore.


7

Penso che dipenda davvero dal tuo stile di codifica personale. Se sei abituato a C ++, Javascript, ecc., Potresti sentirti più a tuo agio usando la sintassi {}. Se sei abituato a Visual Basic, potresti voler usare if: endif; sintassi.

Non sono sicuro che uno possa dire definitivamente che uno è più facile da leggere dell'altro: è una preferenza personale. Di solito faccio qualcosa del genere:

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

Che sia più facile da leggere rispetto a:

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

è una questione di opinione. Vedo perché alcuni ritengono che il secondo modo sia più semplice, ma solo se non hai programmato Javascript e C ++ per tutta la vita. :)


1
No, le parentesi sono oggettivamente più facili da leggere (quando non si utilizza la versione egiziana). Anche se stai facendo le parentesi in modo tale che camminino come un egiziano, è più facile da leggere della sintassi VB perché i moderni editor di testo avranno una funzione di corrispondenza delle parentesi che ti porta dall'apertura alla chiusura della parentesi o viceversa. Non è possibile che abbiano una funzione di corrispondenza della sintassi VB. Inoltre devi considerare la nidificazione e VB fallisce miseramente su questo.
developerwjk,

5

Vorrei usare la prima opzione, se possibile, indipendentemente dalla nuova opzione. La sintassi è standard e tutti lo sanno. È anche retrocompatibile.


5

Entrambi sono uguali.

Ma: se si desidera utilizzare PHP come linguaggio di template nei file di visualizzazione (la V di MVC), è possibile utilizzare questa sintassi alternativa per distinguere tra codice php scritto per implementare business-logic (parti Controller e Model di MVC) e guit logica. Ovviamente non è obbligatorio e puoi usare qualunque sintassi ti piaccia.

ZF usa questo approccio.


5

Non esiste alcuna differenza tecnica tra le due sintassi. La sintassi alternativa non è nuova; era supportato almeno fino a PHP 4, e forse anche prima.

Potresti preferire la forma alternativa perché indica esplicitamente quale struttura di controllo sta finendo:, endwhilead esempio, può solo terminare un whileblocco, mentre se incontri una parentesi graffa, potrebbe chiudere qualcosa.

Potresti preferire la sintassi tradizionale, tuttavia, se usi un editor che ha un supporto speciale per le parentesi graffe in altre sintassi simili al C. Vim, ad esempio, supporta diversi tasti per navigare tra parentesi graffe corrispondenti e all'inizio e alla fine dei blocchi delimitati da parentesi graffe. La sintassi alternativa spezzerebbe quella funzione dell'editor.


3

Alla fine non vuoi semplicemente cercare la seguente riga e poi dover indovinare da dove è iniziata:

<?php } ?>

Tecnicamente e funzionalmente sono gli stessi.


1
Un buon editor di testo avrà un collegamento corrispondente alla parentesi per portarti dove è iniziato. È endif;difficile trovare l'inizio, perché non avranno una funzione simile per questo, e il codice in stile VB non si annida bene.
developerwjk,

3

Dipende tutto, personalmente preferisco la sintassi tradizionale con echi e molte rientranze, poiché è molto più facile da leggere.

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

Sono d'accordo che la sintassi alt sia più chiara con le diverse clausole finali, ma ho davvero difficoltà a gestirle senza l'aiuto dell'evidenziazione dell'editor di testo e non sono abituata a vedere un codice "condensato" come questo:

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

2

Usavo le parentesi graffe ma ora un giorno preferisco usare questa sintassi alternativa abbreviata a causa della leggibilità del codice e dell'accessibilità.


Lo uso nei miei modelli di visualizzazione.
alex

2

Personalmente preferisco farlo in due sezioni separate ma all'interno dello stesso PHP come:

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

?>

Ma forse è più lento?


1

Penso che sia una questione di preferenza. Personalmente uso:

if($something){
       $execute_something;
}

1
se leggessi l'intero thread: si preferisce la sintassi alternativa e molto <em> più pulito </em> quando si modella o si usa la lingua straniera in viste php
Juraj Blahunka,

1

Usavo le parentesi graffe per le condizioni "if, else". Tuttavia, ho trovato "if (xxx): endif;" è più semantico se il codice è fortemente racchiuso e più facile da leggere in qualsiasi editor.

Naturalmente, molti editor sono in grado di riconoscere ed evidenziare blocchi di codice quando vengono selezionate le parentesi graffe. Alcuni fanno anche bene sulla coppia "if (xxx): endif" (es. NetBeans)

Personalmente, consiglierei "if (xxx): endif", ma per il controllo di piccole condizioni (ad es. Solo una riga di codice), non ci sono molte differenze.


1

Sento che nessuna delle risposte preesistenti identifica pienamente la risposta qui, quindi articolerò la mia prospettiva. Funzionalmente, i due metodi sono gli stessi. Se il programmatore ha familiarità con altre lingue dopo la sintassi C, allora probabilmente si sentiranno più a loro agio con le parentesi graffe, oppure se php è la prima lingua che stanno imparando, si sentiranno più a loro agio con la if endifsintassi, poiché sembra più vicino alla lingua normale.

Se sei un programmatore davvero serio e hai bisogno di fare le cose velocemente, allora credo che la sintassi del parentesi graffa sia superiore perché consente di risparmiare tempo a digitare

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

rispetto a

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

Questo è particolarmente vero con altri loop, diciamo, foreachdove finiresti per scrivere altri 10 caratteri. Con le parentesi graffe, devi solo digitare due caratteri, ma per la sintassi basata su parole chiave devi digitare un'intera parola chiave aggiuntiva per ogni ciclo e istruzione condizionale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.