if(){}和if()之间的区别:endif;


159

两者之间有什么区别吗?

if ($value) {

}

...和...

if ($value):

endif;


自从PHP4起,第二种方法就已经存在了,甚至更早了。
英里


1
大多数答案并没有真正解决重点:当您查看一些代码并且有很多关闭命令(例如} } } },也可以完成endif)并且您想知道它们在哪里打开时,哪种方法会更好?答案都不是。它基本上是python设计原则第一个“规则”
cregox

7
显然,这{}是更好的选择,: endif;如果生活公平,这种暴行就不会存在。使用出色的文本编辑器,您将拥有一个键盘快捷键,用于匹配括号,以使您从开头跳转到结尾,反之亦然。可怕的: endif;语法永远不会存在这样的事情。
developerwjk

3
@developerwjk怎么可能永远不存在?
亚历克斯2015年

Answers:


177

它们是相同的,但是如果您的代码中包含MVC并且不想在代码中产生大量回声,那么第二个方法就很棒。例如,在我的.phtml文件(Zend Framework)中,我将编写如下内容:

<?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也可以用大括号括起来,但是至少我个人认为这种方式在这种情况下更加清晰。因为他们知道这是if的结束,而不是某种循环或其他循环的结束。认为您有endfor和endwhile或类似的东西。
Svish

10
我不会使用<?=?>,因为并非所有服务器都支持它,尤其是不允许您更改php.ini的共享托管服务器。
林思琪

2
相关点是<?php endif;。?>-即使在前面的if / else和此语句之间有许多行HTML,您也可以准确地知道结尾是什么。
芬顿

7
为什么“如果您不想在代码中产生大量回声,那么第二个代码就很棒”?我认为传统语法{}也是如此。不需要额外的回声<?php if(...){ ?> ... <?php }else{ ?> ... <?php } ?>。有什么区别<?php if(...): ?> ... <?php else: ?> ... <?php endif ?>
锡胡2014年

9
不知道为什么这个答案是最高的,因为它不是一个很好的例子(使用花括号可以完全达到相同的目的)。
Reinier Kaper 2014年

69

我个人真的很讨厌替代语法。关于花括号的一件好事是,大多数IDE,vim等都具有突出显示的括号。在我的文本编辑器中,我可以双击一个花括号,它将突出显示整个块,因此我可以很容易地看到它的结尾和起点。

我不知道可以突出显示endif,endforeach等的单个编辑器。


11
这应该在PHP模板中使用,在PHP模板中,块的开头和结尾由外语块分隔。如果您的IDE对PHP的理解足够好,可以对其进行解析,那么它也应该endif正确地突出显示为块末。如果没有,您实际上不会购买任何东西,}因为它还是不匹配。
帕维尔米纳夫

2
大多数同伴(至少是我曾经使用过的
同伴

11
Netbeans 7.x高兴地强调了匹配的endforeach,endif等
Jonathan Day

@先生。Minaev:大括号匹配器可能会在98%的情况下正确解析,即使其中包含外部代码也是如此。仅当其中包含易懂的括号“打开但不关闭代码”时,它才会失败。是的,它发生了,但是很少发生。为什么您认为一个复杂的“终点”;解析器方法比简单的解决方案在实践中会做得更好?
PatlaDJ 2012年

我认为最重要的一点是在需要时进行描述。因此,无论我们可能需要使用哪种工具,我们都可以轻松找到它的打开位置。对于PHP尤其如此,有时您需要使用最简单的编辑器进行查看。
cregox

49

我认为这说明一切:

在混合使用PHP和HTML的情况下,这种替代语法非常适合提高可读性。

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

当混合HTML和PHP时,替代的sytnax更容易阅读。在普通的PHP文档中,应使用传统语法。


7
+1,关于目的是什么?我个人认为这对已经很杂乱的语言毫无意义。
Draemon

29

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

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

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


谢谢-我更新了此答案。它在灌木丛中略微跳动,但可能会有所帮助。
gahooa

你说“我们的”是什么意思?
2009年

+1可以避免过多的echo语句和转义引号。:)
John McCollum

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

13

实际上,它们在功能上都是相同的。

但是,如果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

这实际上适用于任何类似的“结局”!;)

同样,总的来说,编辑人员可以更好地处理大括号,从某种意义上说,他们可以将您指向大括号。但是,即使那样也不能使描述性注释的有效性降低。


1
同意这会更好-而不是键入endif-您可以说出if条件的实际作用。
卡洛洛特'16

@cartalot也许用该语言构建(作为可选的关闭命名块参数)甚至会更好,所以我们在关闭错误位置的错误块时可能会出错!:)
cregox


9

我认为在视图脚本中同时使用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 } ?>

这对于长控制语句特别有用,在这种情况下,您可能无法从底部括号看到顶部的声明。


7

我认为这确实取决于您的个人编码风格。如果您习惯使用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 ++进行编程。:)


1
不,括号在客观上更易于阅读(当不使用埃及版本时)。即使您将方括号括起来像埃及人一样,它也比VB语法更易于阅读,因为现代文本编辑器将具有方括号匹配功能,可将您从开括号到闭括号或反之。他们不可能拥有VB语法匹配功能。另外,您还需要考虑嵌套,而VB在此方面失败了。
developerwjk

5

我将尽可能使用第一个选项,而不考虑新选项。语法是标准语法,每个人都知道。它也是向后兼容的。


5

两者是相同的。

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

采埃孚使用这种方法。


5

两种语法之间没有技术上的区别。替代语法不是新语法;它的支持至少可以追溯到PHP 4甚至更早。

您可能更喜欢另一种形式,因为它明确指出了哪个控制结构将要终止:endwhile例如,只能终止一个while块,而如果遇到括号,则它可能会关闭任何内容。

但是,如果使用的编辑器对其他类似C的语法的花括号具有特殊支持,则您可能更喜欢传统语法。例如,Vim支持多次击键,以导航到匹配的括号以及括号分隔的块的开始和结束。替代语法将破坏该编辑器功能。


3

最后,您只是不想寻找以下行,而不必猜测它的开始位置:

<?php } ?>

从技术和功能上讲,它们是相同的。


1
一个好的文本编辑器将具有一个括号匹配的快捷方式,可将您带到开始的地方。它的endif;,这将是很难找到的开始,因为他们不会有一个类似的功能,和VB风格的代码不窝好。
developerwjk

3

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

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

我同意alt语法在不同的end子句中比较干净,但是在没有文本编辑器高亮显示帮助的情况下,我真的很难处理它们,而且我只是不习惯看到这样的“压缩”代码:

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

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


我在视图模板中使用它。
alex

2

就我个人而言,我更喜欢在两个单独的部分中进行修改,但是要在同一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;

?>

但是也许慢一些?



1

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

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

就个人而言,我建议使用“ if(xxx):endif”,但是对于小的条件检查(例如,仅一行代码),差别不大。


1

我觉得以前没有任何答案可以完全在这里找到答案,因此我将阐明自己的观点。从功能上讲,这两种方法是相同的。如果程序员熟悉使用C语法的其他语言,则他们可能会对花括号感到更舒服,否则,如果php是他们正在学习的第一门语言,则他们将对花括号感到更舒服。if endif语法,因为它看起来更接近普通语言。

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

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

相比

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.