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


158

違いはありますか...

if ($value) {

}

...そして...

if ($value):

endif;


2つ目の方法は、PHP4以降ですが、以前とは異なります。
マイル


1
ほとんどの回答は、実際には主要なポイントを扱っいません。いくつかのコードを見ていて、} } } }(などで実行できる)などの終了コマンドがたくさんありendif、それらがどこで開いているかを知りたい場合に、より効果的に機能しますか?答えはどちらでもありません。基本的には、Pythonの設計原則の最初の「ルール」です
cregox 2014

7
明らかに、それ{}はより良いことで: endif;あり、人生が公平であるなら存在しない残虐行為です。優れたテキストエディタを使用すると、括弧を一致させるためのキーボードショートカットが表示され、最初から最後に、またはその逆にジャンプできます。恐ろしい: endif;構文には、そのようなことは決して存在しません。
developerwjk

3
@developerwjkどうしてそれが存在しないのでしょうか?
アレックス2015

回答:


176

それらは同じですが、コードに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; ?>

38
@alex中かっこでも機能しますが、少なくとも個人的には、このようにするとこの方法がより明確になると思います。彼らがあなたが知っているのは、それがifの終わりであり、ある種のループや他の何かのループの終わりではないということです。あなたはendforとendwhileまたは同様の何かを持っていると思います。
Svish

10
<?=?>はすべてのサーバーでサポートされているわけではないため、特にphp.iniを変更できない共有ホスティングサーバーは使用しません。
Siqi Lin、2010

2
適切なポイントは<?php endif;です。?>-前のif / elseとこのステートメントの間のHTMLの多くの行で何が終わっているかを正確に伝えることができます。
フェントン

7
なぜ「コードに多くのエコーを入れたくない場合は、2番目の方法が優れている」のでしょうか。従来の構文{}も同じだと思います。追加のエコーは必要ありません<?php if(...){ ?> ... <?php }else{ ?> ... <?php } ?>。とはどう違い<?php if(...): ?> ... <?php else: ?> ... <?php endif ?>ますか?
Sithu 2014年

9
これは良い例ではないので、なぜこの答えが最も高いのかわかりません(中括弧でもまったく同じことができます)。
Reinier Kaper 2014

69

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

endif、endforeachなどを強調表示できる単一のエディターを知りません。


11
これは、ブロックの最初と最後が外国語のチャンクで区切られているPHPテンプレートで使用されることになっています。IDEがPHPを十分に理解してそれを解析できる場合は、endifブロックの終わりとして正しく強調表示されるはずです。そうでない場合は、}とにかく一致しないので、実際に使用しても何も購入しません。
Pavel Minaev、2009

2
ほとんどの
IDE

11
Netbeans 7.xは、一致するendforeach、endifなどを喜んで強調します
Jonathan Day

@氏。Minaev:中かっこマッチャーは、98%のケースで正しく解析されます。内部に外部コードがあってもです。その中に「コードを開始するが終了しない」という難解な括弧がある場合にのみ失敗します。はい、起こりますが、まれにしか起こりません。なぜあなたは複雑な「終わりなんでも」だと思うのですか?パーサーアプローチは、単純なソリューションよりも実際に優れていますか?
PatlaDJ

最も重要な点は、必要に応じて説明することです。そのため、どのツールを使用する必要があるかに関わらず、どこで開いていたかを簡単に見つけることができます。PHPには特に当てはまります。これは、最も単純なエディターを使用して確認する必要がある場合があります。
cregox 14

49

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

この代替構文は、(PHPとHTMLの両方で)読みやすさを向上させるのに優れています。

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

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


7
+1、その目的は何ですか。個人的には、それはすでに雑然とした言語への無意味な追加だと思います。
ドラえもん2010年

29

当社では、HTMLを処理するための推奨される方法は次のとおりです。

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

結局のところ、それは実際に1つを選択し、それに固執することの問題です。


ありがとう-この回答を更新しました。茂みの周りを少し叩きますが、助けになるかもしれません。
gahooa 2009

あなたが「私たち」と言うとき、あなたは誰を意味しますか?
2009

+1は、過度のエコーステートメントとエスケープされた引用符を回避します。:)
ジョン・マッカラム

エラー:<?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条件が実際に行っていることを言うことができます。
カルタロット2016年

@cartalotは、おそらく言語で(オプションの名前付きブロックの終了引数として)組み込んだほうがいいので、間違った場所で間違ったブロックを閉じるとエラーが発生する可能性があります。:)
cregox 2017年


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

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


1
いいえ、括弧は客観的に読みやすくなっています(エジプト語バージョンを使用していない場合)。ブラケットがエジプト人のように歩くようにブラケットを実行している場合でも、最新のテキストエディターにはブラケットマッチング機能があり、ブラケットを開いてから閉じたり、逆にしたりできるため、VB構文よりも読みやすくなっています。それらがVB構文マッチング関数を持つことができる方法はありません。また、考慮すべきネストがあるため、VBはそれについて無残に失敗します。
developerwjk

5

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


5

どちらも同じです。

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

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


5

2つの構文に技術的な違いはありません。代替構文は新しいものではありません。それは、少なくとも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>';
    }
?>

さまざまなend句を使用することで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; ?>

2

以前は中かっこを使用していましたが、コードの可読性とアクセシビリティのために、今日ではこの省略形の代替構文を使用することを好みます。


ビューテンプレートで使用します。
アレックス

2

個人的には、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行のみ)の場合、それほど大きな違いはありません。


1

既存の回答のいずれもここでの回答を完全に特定しているとは思わないので、私は自分の視点を明確にします。機能的には、2つの方法は同じです。プログラマーがC構文に従う他の言語に精通している場合は、中括弧に慣れていると思われます。そうでない場合は、phpが最初に学習している言語であれば、if endif構文にいるようです。通常の言語に。

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

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

に比べ

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.