Diferencia entre if () {} y if (): endif;

159

¿Hay alguna diferencia entre ...

if ($value) {

}

...y...

if ($value):

endif;

?

alex
fuente
La segunda forma ha estado allí desde PHP4, si no antes.
Millas
1
La mayoría de las respuestas no abordan realmente el punto principal : ¿qué funciona mejor cuando está mirando algún código y hay muchos comandos de cierre como } } } }(que también se pueden hacer endif) y desea saber dónde estaban abiertos? La respuesta es ninguno . Básicamente es la primera "regla" de los principios de diseño de Python .
cregox
77
Obviamente {}es mejor y : endif;es una atrocidad que no existiría si la vida fuera justa. Con un buen editor de texto, tendrá un método abreviado de teclado para combinar corchetes, para saltar de la apertura al cierre o viceversa. Tal cosa no existe ni podría existir para la horrible : endif;sintaxis.
developerwjk
3
@developerwjk ¿cómo podría eso nunca existir?
alex

Respuestas:

177

Son iguales, pero el segundo es excelente si tienes MVC en tu código y no quieres tener muchos ecos en tu código. Por ejemplo, en mis .phtmlarchivos (Zend Framework) escribiré algo como esto:

<?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
fuente
38
@alex También funcionará con llaves, pero al menos personalmente me parece más claro en cosas como esta. Porque saben que es el final de un if y no el final de un ciclo de algún tipo u otra cosa. Piensa que tienes endfor y endwhile o algo similar también.
Svish
10
No usaría el <? =?> Porque no es compatible con todos los servidores, especialmente los de alojamiento compartido que no le permiten cambiar php.ini.
Siqi Lin
2
El punto pertinente es <? Php endif; ?> - puede decir exactamente qué está terminando incluso con muchas líneas de HTML entre el if / else anterior y esta declaración.
Fenton
77
¿Por qué "el segundo es genial si no quieres tener muchos ecos en tu código"? Creo que es igual para la sintaxis tradicional {}también. No se necesita eco adicional <?php if(...){ ?> ... <?php }else{ ?> ... <?php } ?>. ¿Cuál es la diferencia con <?php if(...): ?> ... <?php else: ?> ... <?php endif ?>?
Sithu
9
No estoy seguro de por qué esta respuesta es la más alta, ya que no es un gran ejemplo (puede lograr exactamente lo mismo con llaves).
Reinier Kaper
69

Personalmente, realmente odio la sintaxis alternativa. Una cosa buena de los corchetes es que la mayoría de los IDE, vim, etc., todos tienen resaltado de corchetes. En mi editor de texto puedo hacer doble clic en una llave y resaltará todo el fragmento para que pueda ver dónde termina y comienza muy fácilmente.

No conozco un solo editor que pueda resaltar endif, endforeach, etc.

dprevite
fuente
11
Se supone que esto debe usarse en plantillas PHP, donde el principio y el final del bloque están separados por fragmentos de idioma extranjero. Si su IDE entiende PHP lo suficientemente bien como para analizarlo, también debería resaltarlo endifcorrectamente como fin de bloque. Si no es así, en realidad no compra nada usando, }ya que de todos modos no coincidirá.
Pavel Minaev
2
La mayoría de las ide (al menos las que he usado) solo resaltan {}
AntonioCS
11
Netbeans 7.x destaca felizmente la coincidencia de foreforeach, endif, etc.
Jonathan Day
@Señor. Minaev: El emparejador de llaves se analizará correctamente probablemente en el 98% de los casos, incluso si hay un código extraño en su interior. Solo fallará cuando haya una llave ezotérica "abriendo pero no cerrando el código" dentro de ella. Sí, sucede, pero rara vez sucede. ¿Por qué crees que un complejo "fin-lo que sea"; ¿El enfoque analizador funcionará mejor prácticamente que la solución simple?
PatlaDJ
Creo que el punto más importante es ser descriptivo , cuando sea necesario. Por lo tanto, podemos encontrar fácilmente dónde estaba abierto, independientemente de la herramienta que necesitemos usar. Especialmente cierto para PHP, que de vez en cuando necesita ver utilizando los editores más simplistas.
cregox
49

Creo que esto lo dice todo:

Esta sintaxis alternativa es excelente para mejorar la legibilidad (¡tanto para PHP como para HTML!) en situaciones en las que tiene una combinación de ellos.

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

Al mezclar HTML y PHP, la sintaxis alternativa es mucho más fácil de leer. En documentos PHP normales se debe usar la sintaxis tradicional.


fuente
77
+1, Buena respuesta sobre cuál es su propósito. Personalmente, creo que es una adición inútil a un lenguaje ya desordenado.
Draemon
29

En nuestra empresa, la forma preferida de manejar HTML es:

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

Al final, realmente se trata de elegir uno y apegarse a él.

gahooa
fuente
Gracias. Actualicé esta respuesta. Golpea un poco alrededor del arbusto, pero puede ayudar.
gahooa
¿A quién te refieres cuando dices "nuestro"?
Pensamiento extraño
+1 para evitar declaraciones de eco excesivas y comillas escapadas. :)
John McCollum
ERROR:<?php if(TRUE){?> test <?php }?> <?php else{ ?> test2 <?php }?>
Yousha Aleayoub
13

De hecho, ambos son iguales, funcionalmente.

Pero si se endifestá alejando demasiado del corresponsal if, creo que es una práctica mucho mejor hacer un comentario de referencia. Solo para que pueda encontrar fácilmente dónde estaba abierto. No importa el idioma que sea:

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

¡Eso realmente se aplica a cualquier "cosa de cierre" análoga! ;)

Además, en general, los editores manejan mejor los corchetes, en el sentido de que pueden indicarle dónde estaba abierto. Pero incluso eso no hace que los comentarios descriptivos sean menos válidos.

cregox
fuente
1
acuerda que esto es mucho mejor, en lugar de escribir endif, puede decir qué está haciendo realmente la condición if.
cartalot
¡@cartalot tal vez sería bueno tenerlo incorporado en el lenguaje (como un argumento opcional de cierre del bloque con nombre), por lo que podríamos tener errores al cerrar bloques incorrectos en lugares incorrectos! :)
cregox
9

Creo que es particularmente más claro cuando usas una combinación de ifs, forsy foreaches en los guiones de vista:

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

Opuesto a:

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

Esto es especialmente útil para declaraciones de control largas donde es posible que no pueda ver la declaración superior desde la llave inferior.

Harry Mustoe-Playfair
fuente
7

Creo que realmente depende de tu estilo de codificación personal. Si está acostumbrado a C ++, Javascript, etc., puede sentirse más cómodo usando la sintaxis {}. Si está acostumbrado a Visual Basic, puede usar if: endif; sintaxis.

No estoy seguro de que uno pueda decir definitivamente que uno es más fácil de leer que el otro, es una preferencia personal. Usualmente hago algo como esto:

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

Si eso es más fácil de leer que:

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

Es una cuestión de opinión. Puedo ver por qué algunos sentirían que la segunda forma es más fácil, pero solo si no has estado programando en Javascript y C ++ toda tu vida. :)

livefree75
fuente
1
No, los corchetes son objetivamente más fáciles de leer (cuando no se usa la versión egipcia). Incluso si está haciendo los corchetes de manera que caminen como un egipcio, es más fácil de leer que la sintaxis VB porque los editores de texto modernos tendrán una función de coincidencia de corchetes para llevarlo de la apertura al cierre del corchete o al revés. No hay forma de que puedan tener una función de coincidencia de sintaxis VB. También tiene que considerar la anidación, y VB falla miserablemente en eso.
developerwjk
5

Usaría la primera opción si fuera posible, independientemente de la nueva opción. La sintaxis es estándar y todos lo saben. También es compatible con versiones anteriores.

Paulo
fuente
5

Los dos son iguales.

Pero: si desea usar PHP como lenguaje de plantillas en sus archivos de vista (la V de MVC), puede usar esta sintaxis alternativa para distinguir entre el código php escrito para implementar la lógica de negocios (partes de Controlador y Modelo de MVC) y gui- lógica. Por supuesto, no es obligatorio y puede usar la sintaxis que desee.

ZF usa ese enfoque.

Itay Moav -Malimovka
fuente
5

No hay diferencia técnica entre las dos sintaxis. La sintaxis alternativa no es nueva; fue compatible al menos desde PHP 4, y tal vez incluso antes.

Es posible que prefiera la forma alternativa porque indica explícitamente qué estructura de control está finalizando: endwhilepor ejemplo, solo puede terminar un whilebloque, mientras que si encuentra una llave, podría estar cerrando cualquier cosa.

Sin embargo, es posible que prefiera la sintaxis tradicional si utiliza un editor que tenga soporte especial para llaves en otras sintaxis tipo C. Vim, por ejemplo, admite varias pulsaciones de teclas para navegar a llaves coincidentes y al inicio y al final de bloques delimitados por llaves. La sintaxis alternativa rompería esa característica del editor.

Rob Kennedy
fuente
3

Al final, simplemente no desea buscar la siguiente línea y luego tener que adivinar dónde comenzó:

<?php } ?>

Técnica y funcionalmente son lo mismo.

Bondt
fuente
1
Un buen editor de texto tendrá un acceso directo de coincidencia de paréntesis para llevarlo a donde comenzó. Es endif;difícil encontrar el comienzo, porque no tendrán una función similar para eso, y el código de estilo VB no encaja bien.
developerwjk
3

Todo depende, personalmente prefiero la sintaxis tradicional con ecos y muchas hendiduras, ya que es mucho más fácil de leer.

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

Estoy de acuerdo en que la sintaxis alternativa es más limpia con las diferentes cláusulas finales, pero realmente me resulta difícil tratarlas sin la ayuda del resaltado del editor de texto, y no estoy acostumbrado a ver código "condensado" como este:

<?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
fuente
2

Solía ​​usar llaves, pero ahora prefiero usar esta sintaxis alternativa abreviada debido a la legibilidad y accesibilidad del código.


fuente
Lo uso en mis plantillas de vista.
alex
2

Personalmente prefiero hacerlo en dos secciones separadas pero dentro del mismo PHP como:

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

?>

Pero tal vez es más lento?

Henrik
fuente
1

Creo que es una cuestión de preferencia. Yo personalmente uso:

if($something){
       $execute_something;
}
Sergio Rodriguez
fuente
1
si hubiera leído todo el hilo: se prefiere la sintaxis alternativa y mucho <em> limpiador </em> al crear plantillas o usar un idioma extranjero en las vistas de php
Juraj Blahunka
1

Solía ​​usar llaves para las condiciones "if, else". Sin embargo, encontré "if (xxx): endif;" es más semántico si el código está muy envuelto y es más fácil de leer en cualquier editor.

Por supuesto, muchos editores son capaces de reconocer y resaltar fragmentos de código cuando se seleccionan las llaves. Algunos también funcionan bien en el par "if (xxx): endif" (por ejemplo, NetBeans)

Personalmente, recomendaría "if (xxx): endif", pero para una comprobación de condición pequeña (por ejemplo, solo una línea de código), no hay muchas diferencias.

Aaron Chen
fuente
1

Siento que ninguna de las respuestas preexistentes identifica completamente la respuesta aquí, así que voy a articular mi propia perspectiva. Funcionalmente, los dos métodos son iguales. Si el programador está familiarizado con otros lenguajes que siguen la sintaxis C, entonces probablemente se sentirán más cómodos con los frenos, o si php es el primer idioma que están aprendiendo, se sentirán más cómodos con la if endifsintaxis, ya que parece más cercana al lenguaje normal.

Si eres un programador realmente serio y necesitas hacer las cosas rápido, entonces creo que la sintaxis de las llaves es superior porque ahorra tiempo escribiendo

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

comparado con

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

Esto es especialmente cierto con otros bucles, por ejemplo, foreachdonde terminaría escribiendo 10 caracteres adicionales. Con llaves, solo necesita escribir dos caracteres, pero para la sintaxis basada en palabras clave, debe escribir una palabra clave adicional para cada ciclo y declaración condicional.

Andrés
fuente