すべての行に<?phpと?>があるのはなぜですか


24

私はこの規則をほぼどこでも見てきましたが、時々、私を夢中にさせようとしています。

<?php //The loop ?>
<?php while ( have_posts() ) : the_post(); ?>
    <?php the_content(); ?>
<?php endwhile; // end of the loop. ?>

どこ<?phpと閉鎖は?>介在HTMLコードがない場合でも、一つ一つのライン上にあります。

私の質問は:なぜですか? なぜこれらすべての追加タグを含めるのですか?

私にとって、この規則はコードにかなりの量の混乱を追加し、そもそも従うのが面倒であり、開始タグまたは終了タグを誤って省くためにさらに多くの場所を追加しているようです。

注意

これは、WordPressの例であるTwenty-Twelveテーマから抜粋したコードです。


また、略式whileステートメント= o
トムJノウェル

3
近くにフラグを付ける-この質問に対する明確な答えはありません、それは確かにないWPの特定の問題だ- PHPでの作業すべての人がこの問題に直面するだろう
ANU

3
@anu:最初に、質問には常に単一の決定的な答えがあるとは限りません(それでもベストアンサーがあるかもしれません)。ガイドラインには「実用的で回答可能」と書かれています。第二に、はい、これは技術的にはPHPの問題ですが、WPで作業している短い時間で、これをはるかに多く見てきました。そのため、これはWPに限定されませんが、WPの設定で尋ねるのに十分な相関関係があるように思えます。
先天性

回答:


20

これはどのWordPressスタイルガイドでも推奨されておらず、コーディングスタイルが悪いと思います。初心者がこのスタイルを使用しているのは、おそらくHTMLに近い感じがするからです…

残念ながら、デフォルトのテーマはこのスタイルを頻繁に使用しているため、一部の初心者はコードスタイルの一部であると考えるかもしれません。

このスタイルの欠点の1つは、コメントの処理です。次の例をよく見て、作者が期待することをどのように実行しないかを見てください。

<?php echo 'Important: '; // announcement ?>
<?php echo ' enter the word '; /* start ?>
<?php echo '<b>password</b>'; /* the end */ ?>

それをデバッグしてください。:)

規則:両方の言語で出力を作成する必要がある場合にのみ、PHPコンテキストとHTMLコンテキストを切り替えます。他のすべての場合には、通常の改行を使用します。

更新、さらなる考え:すべての有効なHTMLファイルは完全で有効なPHPプログラムです。はい、実際のP​​HPコードが1行含まれていなくても可能です。

HTMLから始めて、少しずつPHPを少しずつ追加していくと、ここで説明しているスタイルになってしまう可能性があります。そこで、リファクタリングがゲームに取り入れられます。すべてが期待どおりに実行されたら、コードを可能な限り読みやすくなるまで書き直します。

この最後のステップがなければ幸せな人もいると思います。だからこそ、これはすぐに死ぬことはないでしょう。


上記の構文の強調表示が、そのコメントで実際に何が起こるかを示していないのは残念です
...-webaware

9
@webawareこれは問題をさらに詳しく示していると思います。:)
fuxia

真:)(SEコメントポリスを満足させるためにいくつかの文字)
ウェブウェア

2
@AndyAdamsまあ、言い直しました。そして今、あなたは邪悪な推薦者になります。:)
fuxia

3
テーマではこのスタイルが使用されます。テーマをリファクタリングするときは、コードをできるだけ読みやすくなるように書き直すことをお勧めします。つまり、echo / printf / var_dumpを周囲に配置せ<? ... ?>ず、ネストを理解しやすくするために各制御構造を独自のペア内に配置します。ただし、OPの例とは異なる方法で行うことの1つはthe_post();、独自の行を作成することです。
ライライアン

12

PHPコメントではこれを避けていますが、テンプレートファイルではPHPの熱心なオープナー/クローザーです。別の方法としては、PHP文字列を介してHTMLをエコーする方法がありますが、これは私の意見ではさらに悪く見えます。原始的な例として:

<!-- Example 1 -->
<ul>
    <?php
        foreach ( $list_items as $list_item ) {
            echo "<li><a href='" . $list_item->url . "'>" . $list_item->name . "</a></li>";
        }
    ?>
</ul>

<!-- Example 2 -->
<ul>
    <?php foreach ( $list_items as $list_item ) : ?>
        <li>
            <a href="<?php echo $list_item->url; ?>">
                <?php echo $list_item->name; ?>
            </a>
        </li>
    <?php endforeach; ?>
</ul>

例2はより冗長ですか?たぶん?しかし、私の意見では、読みやすく編集しやすいです。複雑なHTMLではどれだけいものになるか想像できます。

また、単にサイドノートとして:使用するendforeachendif、あなたのPHPのロジックを強化する可読性の間でHTMLを書くトンと比較}


5
巨大な利点}を超えるendifただし、開口部は、ここで、(多くのエディタで)あなたが簡単に見ることができるということで{あり、すべてが適切に閉じられているのでか。それを理解しendif、条件付きの束を考えてみてください

2
foreach ( $list_items as $list_item ) printf( '<li><a href="%1$s">%2$s</a></li>', $list_item->url, $list_item->name );– HTMLとPHPの2行がうまく分離されています。:P
fuxia

4
@toscho:ポイントを完全に逃しました。あなたはまだPHPとHTMLを混ぜていますが、2番目のスタイルを好む人は、PHP文字列内にHTMLが含まれないようにしたいので、2番目のスタイルを好みます。PHPをテンプレート言語として使用する場合、2番目のスタイルを使用するのは、PHPとHTMLの混合物を賢明にネストする唯一の方法であるためです。一方、PHPをスクリプト言語として使用する場合、スクリプトから、アプリケーションロジックをテンプレートから分離するとき。第二のスタイルは、短いタグが利用可能な場合でも良いだろう:<? ... ?><?= ... ?>
ライライアン

1
@Piet:ブレースのマッチングに問題がある場合、おそらくインデントを聞いたことはありませんか?また、endif適切なエディターでのオープニングを強調表示するように構成できる必要があります。
ライライアン

4
@LieRyan いい人。
1

10

これは、ページを次のように表示するかどうかの選択に関するものです。

  • 完全にPHPで生成されたエンティティとして
  • PHPテンプレートタグを使用したHTMLドキュメントテンプレートとして

人によって考え方が異なります。関数が純粋なPHPのブロックのように感じるため、関数がこのスタイルを使用することはほとんどないことに注意してください。一方、テンプレートはファイル全体に広がっており、純粋なHTMLの量はPHPの量よりも簡単に多いため、テンプレートでは珍しいことではありません。

テンプレートエンジン(Mustache、Twigなど)を見ると、構文は単純なPHPの冗長性を排除する傾向があることを除いて、このスタイルによく似ています。

PS私は、PHPをHTMLに正しく埋め込むことについて話していることに注意してください。文字通りすべての行でタグを開いたり終了したりするのではありません。


2

私の質問は:なぜですか?なぜこれらすべての追加タグを含めるのですか?

答えはとても簡単です:観客。(プログラマーではなく)人がテーマをつかむと、インストールをFTPで送信し、5分間のセットアップを実行するなど、既にプログラミングをしているように感じます。その後、テーマの何でも 1行を追加または変更したい場合、HTMLが何であるかをすでに理解している可能性があります。PHPはまだ手の届かないところにあります。したがって、この背後にある考え方は、ミスを犯したときにすべてを壊すことなく、要素を簡単に追加または削除できるようにすることだと思います。

注:これは、私が好む、好む、または推奨するものではありません。これが起こる理由は、まさに私が考えていることです。


0

いくつかの新しいプログラマがこの方法で訓練されていることがわかりました。Lyndaで40時間のコースを受講しており、インストラクターは、関数定義を除き、すべての行にPHPタグをドロップしています。おそらく、HTMLとPHPの間に明確に線を引くことで、HTMLの終わりとPHPの始まりを新しい人々が理解するのに役立つでしょう。その後、おそらく習慣です。私はそれ自体に悩まされ始め、他の誰かが文句を言っているかどうかを見ることにしました。

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