【问题标题】:Difference between if () { } and if () : endif;if () { } 和 if () 的区别:endif;
【发布时间】:2010-10-08 12:37:51
【问题描述】:

...之间有什么区别吗?

if ($value) {

}

...和...

if ($value):

endif;

?

【问题讨论】:

  • 第二种方式自 PHP4 以来一直存在,如果不是更早的话。
  • 大多数答案并没有真正解决the main point:当您查看一些代码并且有很多关闭命令(例如} } } })时效果更好(可以使用@987654328完成@ 以及)你想知道他们在哪里开放吗? The answer is neither。基本上是first "rule" of python design principles
  • 显然{} 更好,: endif; 是如果生活公平就不会存在的暴行。使用好的文本编辑器,您将拥有匹配括号的键盘快捷键,可以将您从开头跳转到结尾,反之亦然。对于可怕的: endif; 语法,这种东西不存在,也不可能存在。
  • @developerwjk 这怎么可能不存在?

标签: php syntax


【解决方案1】:

它们是相同的,但如果您的代码中包含 MVC 并且不想在代码中出现很多回声,则第二个非常好。例如,在我的.phtml 文件(Zend 框架)中,我会这样写:

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

【讨论】:

  • @alex 它也适用于大括号,但至少我个人觉得这种方式在这样的事情上更清晰。因为他们知道这是 if 的结束,而不是某种循环或其他东西的结束。认为你也有 endfor 和 endwhile 或类似的东西。
  • 我不会使用 = ?> 因为并非所有服务器都支持它,尤其是不允许您更改 php.ini 的共享主机。
  • 相关点是 - 即使在前面的 if / else 和这个语句之间有许多 HTML 行,你也可以准确地知道什么是结束。
  • 为什么“如果你不想在你的代码中有很多回声,第二个很棒”?我认为传统语法{} 也是如此。不需要额外的回声&lt;?php if(...){ ?&gt; ... &lt;?php }else{ ?&gt; ... &lt;?php } ?&gt;。和&lt;?php if(...): ?&gt; ... &lt;?php else: ?&gt; ... &lt;?php endif ?&gt;有什么区别?
  • 不知道为什么这个答案是最高的,因为它不是一个很好的例子(你可以用花括号实现完全相同)。
【解决方案2】:

在我们公司,处理 HTML 的首选方式是:

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

最后,真的是选择一个并坚持下去的问题。

【讨论】:

  • 错误:&lt;?php if(TRUE){?&gt; test &lt;?php }?&gt; &lt;?php else{ ?&gt; test2 &lt;?php }?&gt;
  • 在 { 到 ?> 之间放一个空格
【解决方案3】:

它们在功能上确实是相同的。

但是,如果endif 与通讯员if 相差太远,我认为给它一个参考评论是更好的做法。这样您就可以轻松找到它的打开位置。不管是什么语言:

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

这实际上适用于任何类似的“关闭事物”! ;)

此外,一般来说,编辑器会更好地处理大括号,因为他们可以将您指向打开的位置。但即使这样也不会降低描述性 cmets 的有效性。

【讨论】:

  • 同意这样更好 - 而不是输入 endif - 你可以说出 if 条件实际上在做什么。
  • @cartalot 也许在语言中构建会更好(作为可选的关闭命名块参数),所以我们可能会在错误的地方关闭错误的块时出错! :)
【解决方案4】:

您可以在官方文档中找到它:PHP: Alternative syntax for control structures

【讨论】:

    【解决方案5】:

    我认为当您在视图脚本中混合使用ifs、fors 和foreaches 时,它会更加清晰:

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

    相对于:

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

    这对于可能无法从底部大括号看到顶部声明的长控制语句特别有用。

    【讨论】:

      【解决方案6】:

      我认为这真的取决于你个人的编码风格。 如果您习惯于 C++、Javascript 等,您可能会觉得使用 {} 语法更舒服。 如果您习惯于 Visual Basic,则可能需要使用 if : endif;语法。

      我不确定是否可以肯定地说一个比另一个更容易阅读 - 这是个人喜好。我通常会这样做:

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

      这是否比以下更容易阅读:

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

      见仁见智。我明白为什么有些人会觉得第二种方式更容易——但前提是你一生都没有用 Javascript 和 C++ 编程。 :)

      【讨论】:

      • 不,括号客观上更容易阅读(不使用埃及版本时)。即使您使用括号使它们像埃及人一样走路,它也比 VB 语法更容易阅读,因为现代文本编辑器将具有括号匹配功能,可以将您从左括号带到右括号或其他方式。他们不可能有VB语法匹配功能。您还需要考虑嵌套,而 VB 在这方面失败了。
      【解决方案7】:

      如果可能,我会使用第一个选项,而不管新选项如何。语法是标准的,每个人都知道。它也向后兼容。

      【讨论】:

        【解决方案8】:

        两者都是一样的。

        但是: 如果您想在视图文件(MVC 的 V)中使用 PHP 作为模板语言,您可以使用这种替代语法来区分为实现业务逻辑(MVC 的控制器和模型部分)和 gui 逻辑而编写的 php 代码。 当然这不是强制性的,你可以使用任何你喜欢的语法。

        ZF 使用这种方法。

        【讨论】:

          【解决方案9】:

          这两种语法在技术上没有区别。替代语法并不新鲜。至少早在 PHP 4 甚至更早的版本就支持它。

          您可能更喜欢另一种形式,因为它明确说明了哪个控制结构正在结束:例如,endwhile 只能终止 while 块,而如果遇到大括号,它可能会关闭任何东西。

          不过,如果您使用的编辑器特别支持其他类 C 语法中的大括号,您可能更喜欢传统语法。例如,Vim 支持几个键击来导航到匹配的大括号以及大括号分隔块的开头和结尾。替代语法会破坏该编辑器功能。

          【讨论】:

            【解决方案10】:

            最后,您只是不想寻找以下行,然后不得不猜测它从哪里开始:

            <?php } ?>
            

            在技术和功能上它们是相同的。

            【讨论】:

            • 一个好的文本编辑器会有一个括号匹配的快捷方式,可以带你到它开始的地方。它的endif; 很难找到起点,因为它们没有类似的功能,而且 VB 风格的代码嵌套不好。
            【解决方案11】:

            这一切都取决于,我个人更喜欢带有回声和大量缩进的传统语法,因为它更容易阅读。

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

            我同意 alt 语法对于不同的结束子句更清晰,但如果没有文本编辑器突出显示的帮助,我真的很难处理它们,而且我只是不习惯看到这样的“压缩”代码:

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

            【讨论】:

              【解决方案12】:

              我以前使用花括号,但现在由于代码的可读性和可访问性,我更喜欢使用这种简写替代语法。

              【讨论】:

              • 我在视图模板中使用它。
              【解决方案13】:

              我个人更喜欢将它分成两个单独的部分,但在同一个 PHP 中,例如:

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

              但也许它更慢?

              【讨论】:

                【解决方案14】:

                我认为这是一个偏好问题。我个人使用:

                if($something){
                       $execute_something;
                }
                

                【讨论】:

                • 如果您阅读了整个线程:在 php 视图中进行模板化或使用外语时,首选替代语法并且更简洁
                【解决方案15】:

                我曾经使用大括号来表示“if, else”条件。但是,我发现“if(xxx): endif;”如果代码被大量包装并且在任何编辑器中更易于阅读,则更具语义。

                当然,在选择了CURLY括号时,批量编辑器能够识别并突出显示代码的块。有些在“if(xxx):endif”对(例如,NetBeans)上也做得很好

                个人比较推荐“if(xxx):endif”,但是对于小条件检查(比如只有一行代码),差别不大。

                【讨论】:

                  【解决方案16】:

                  我觉得没有一个预先存在的答案可以完全确定这里的答案,所以我将阐述我自己的观点。从功能上讲,这两种方法是相同的。如果程序员熟悉遵循 C 语法的其他语言,那么他们可能会对大括号感到更自在,或者如果 php 是他们正在学习的第一种语言,他们会更加适应 if endif语法,因为它似乎更接近于常规语言。

                  如果你是一个非常认真的程序员并且需要快速完成工作,那么我相信花括号语法会更好,因为它可以节省打字时间

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

                  相比

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

                  对于其他循环尤其如此,例如foreach,您最终会输入额外的 10 个字符。使用大括号,您只需要输入两个字符,但对于基于关键字的语法,您必须为每个循环和条件语句输入一个完整的额外关键字。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-01-18
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多