web-dev-qa-db-ja.com

if(){}とif()の違い:endif;

間に違いはありますか...

if ($value) {

}

...そして...

if ($value):

endif;

151
alex

それらは同じですが、コードにMVCがあり、コードに多くのエコーを入れたくない場合は、2番目の方法が最適です。たとえば、.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; ?>
167
Thomaschaaf

私は個人的に代替構文が本当に嫌いです。中括弧についての良い点の1つは、ほとんどのIDE、vimなどにすべてブラケットの強調表示があることです。テキストエディタでブレースをダブルクリックすると、ブレース全体が強調表示されるので、ブレースの終了位置と開始位置を非常に簡単に確認できます。

Endif、endforeachなどを強調表示できるエディターが1つもありません。

66
dprevite

私はこれがすべてを言っていると思う:

この代替構文は、それらが混在している状況で読みやすさを改善するのに優れています(PHPとHTMLの両方の場合!)。

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

HTMLとPHPを混在させると、代替構文が読みやすくなります。通常のPHPドキュメントでは、従来の構文を使用する必要があります。

44
Olaf

当社では、HTMLを処理するための好ましい方法は次のとおりです。

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

最後に、それは本当に1つを選択してそれに固執する問題です。

28
gahooa

実際、機能的には両方とも同じです。

しかし、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

それは実際には、類似の「クロージングシング」に適用されます。 ;)

また、一般に、編集者は中かっこをより適切に処理します。つまり、開いている場所を示すことができるという意味です。しかし、それでも説明的なコメントはそれほど有効ではありません。

10
cregox

公式ドキュメントのどこにありますか? PHP:制御構造の代替構文

10
Jeremy Ruten

ビュースクリプトで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 } ?>

これは、下の波括弧から上の宣言を見ることができない場合がある長い制御ステートメントに特に役立ちます。

それは本当にあなたの個人的なコーディングスタイルに依存していると思います。 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; ?>

意見の問題です。 2番目の方法が簡単だと感じる人がいる理由はわかりますが、JavascriptとC++でずっとプログラミングしていない場合に限ります。 :)

7
livefree75

新しいオプションに関係なく、可能な限り最初のオプションを使用します。構文は標準であり、誰もが知っています。また、下位互換性もあります。

5
Paulo

両方とも同じです。

ただし、ビューファイル(MVCのV)でテンプレート言語としてPHPを使用する場合は、この代替構文を使用して、ビジネスロジック(コントローラーおよびモデルパーツを実装するために記述されたphpコードを区別できます) MVC)およびgui-logic。もちろん、これは必須ではなく、好きな構文を使用できます。

ZFはそのアプローチを使用します。

2つの構文に技術的な違いはありません。代替構文は新しいものではありません。少なくともPHP 4までさかのぼってサポートされており、おそらくそれ以前のバージョンでもサポートされていました。

どの制御構造が終了するかを明示的に示すため、代替形式を好む場合があります。たとえば、endwhileは、whileブロックのみを終了できますが、中かっこに遭遇すると、何かを閉じることができます。

ただし、他のCのような構文で中括弧を特別にサポートするエディターを使用する場合は、従来の構文を好むかもしれません。たとえば、Vimは、一致するブレースおよびブレースで区切られたブロックの開始と終了に移動するためのいくつかのキーストロークをサポートしています。代替構文は、そのエディター機能を破壊します。

5
Rob Kennedy

個人的には、エコーと多くのインデントを備えた従来の構文を好むのです。読みやすいからです。

<?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; ?>
3
Yi Yang

最終的には、次の行を探して、それがどこから始まったかを推測する必要はありません。

<?php } ?>

技術的にも機能的にも同じです。

2
Bondt

以前は中括弧を使用していましたが、今ではコードの読みやすさとアクセシビリティのために、この短縮形の代替構文を使用することを好みます。

2

「if、else」条件には中括弧を使用していました。しかし、「if(xxx):endif;」が見つかりましたコードが大きくラップされていて、エディターで読みやすい場合は、より意味があります。

もちろん、多くのエディターは、中括弧が選択されたときにコードの塊を認識して強調表示することができます。 「if(xxx):endif」ペア(NetBeansなど)でもうまくいくものもあります

個人的には、「if(xxx):endif」をお勧めしますが、小規模な条件チェック(たとえば、1行のコードのみ)については、それほど違いはありません。

1
Aaron Chen

好みの問題だと思います。私は個人的に使用します:

if($something){
       $execute_something;
}
1

個人的には、同じPHPのような2つの別個のセクションで作成することを好みます。

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

既存の回答のいずれも、ここでの回答を完全に特定するものではないと感じているので、自分の視点を明確にします。機能的には、2つの方法は同じです。プログラマーがC構文に従う他の言語に精通している場合は、ブレースに慣れているか、PHPが学習している最初の言語である場合、ifendif構文に慣れているでしょう。通常の言語に近いようです。

あなたが本当に真剣なプログラマーであり、物事を早く終わらせる必要がある場合、中括弧構文はタイピングの時間を節約するので優れていると思います

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

に比べ

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

これは、他のループ、たとえば、foreachで特に当てはまります。この場合、余分な10文字を入力することになります。中かっこを使用すると、2文字入力するだけで済みますが、キーワードベースの構文では、すべてのループおよび条件ステートメントに対して追加のキーワード全体を入力する必要があります。

0
Andrew