9

私はphpBB2をハッキングして、他の人がダウンロードして使用したデータベースにいくつかのmodを送信することで、 PHPを学びました。(phpBB2がphpBB3でサポートされるようになったのは今のところ長いとは思わないので、v2 modsデータベースはもうサポートされていません。)

phpBBで私のお気に入りの1つは、エディターがHTMLとPHPを完全に分離できるテンプレートシステムでした。PHPファイルには、PHP:ロジック、データベースクエリ、およびテンプレートのアクティブ化が含まれていました。TPLファイルには、テンプレート(HTML、テンプレート変数、および条件付きブロックまたは繰り返しブロックを可能にする特殊なHTMLコメント)が含まれていました。

ただし、誰かのPHPコードをオンラインで見ると、それは単一の関数などで動作する小さなスニペットであるか、PHPがHTMLを含む文字列でいっぱいです(さらに悪いことに、PHPが散在しているHTML)。phpBBは、私が調べた唯一のPHPであり、実際に言語とマークアップ言語を分離しています。これは、他のPHPコードベースがそのようなことを行うものはほとんどないことを示唆しています。

もう一度PHPを使い始めたいと思っていますが、今回はphpBBフォーラムではなく、チームで開催されます。私の経験によると、PHPとHTMLの分離は一般的ではありません(これが間違っている場合は訂正してください!)。しかし、私はその境界線にとても慣れているので、PHPとHTMLの混合を読むのは嫌いです。

PHPプログラミングの「現実の世界」では、どのような方法が推奨されますか。

  • HTMLの文字列を含むPHPファイル
  • PHPブロックで分割されたHTMLファイル
  • PHPとHTMLは完全に分離しています(私は望みますか?)
  • 他に何かありますか?
4

9 に答える 9

7

PHPをHTMLから分離したい場合は、テンプレートエンジンを使用できます(smarty http://www.smarty.net/のように)。

于 2010-07-10T20:06:14.613 に答える
5

個人的には、PHPがすでに完全に優れたソリューションである場合、テンプレートシステム/言語をミックスに追加する理由はありません。

私が好むアプローチは、アプリケーションのロジックからディスプレイを分離することです。これは、本格的なMVCフレームワークの形をとることができます。ただし、コードの記述方法の単純な問題である可能性もあります。

拡張:

HTMLに大量のASPコードを散在させるという間違いを犯して以来、私はページロジックを表示から分離しようと試みてきました。これは、単一のページ内で、すべてのページロジックを上部に配置し、表示する情報を変数に格納してから、PHPファイルの下部にあるHTML内にそれらをエコーアウトすることを意味します。HTML部分に表示される唯一のロジックは、表示ロジックです。言い換えれば、単純なエラー処理、ifs、ループなどです。基本的に、ほとんどのテンプレート言語で見られるものと同じものです。

テンプレート言語を避ける理由は、それが私が心配する必要のある構文のさらに別の形式だからです。ポイントは何ですか?PHPは、この目的に必要な以上のものを提供します。

一方、物事を分離することで、単純なMVCアプローチをとることができます。

controller.php

<?php
// some application logic
$data['message'] = 'Hello, World.';

include 'view.php';

exit;
?>

view.php:

<html>
<head>
<title>
A simple 'MVC' view
</title>
</head>
<body>
<p>
<?php

echo $data['message'];

?>
</p>
</body>
</html>

これには欠点と問題がないわけではありません。ただし、アプリケーションロジックと表示を完全に明確に分離できると考える場合は、間違いです。

于 2010-07-10T23:24:32.280 に答える
4

MVC用にカスタマイズされたコードイグナイターベースを使用し、ロジックとレイアウトを分離しています。これは、必ずしもhtmlにphpがないことを意味するわけではなく、ロジックに使用されていないことを意味します。テンプレートimhoでphpコードを使用してレコードセットをループすることはまったく問題ありません。ビジネスオブジェクトと通信しようとせず、実際にレイアウトテンプレートで何かを実行しようとしないでください。もちろん、そこにあるすべてのphpコードを本当に削除したい場合は、テンプレートのtalや他の100万のようなものを調べることもできます。「ここに特別な状況を挿入」しない限り、それはほとんどやり過ぎだと思います。

修正されたタイプミスを編集する

于 2010-07-10T20:07:33.547 に答える
3

私の経験では、多くのPHP開発は、良くも悪くも、必要に応じてHTMLのスニペットを出力するインクルードを介して相互に接続されたphpファイルになります。

ただし、私のPHPの経験のほとんどは、「最もエレガントで効率的なソリューションが必要」というよりも、「機能するものが必要なだけ」のソリューションです。

于 2010-07-10T20:06:36.373 に答える
3

誰かのPHPコードをオンラインで見るときはいつでも、それは単一の関数などで動作する小さなスニペットであるか、PHPがHTMLを含む文字列でいっぱいです(さらに悪いことに、PHPが散在しているHTML)。

ええ、そこにあるコードの一般的な品質は恥ずかしいものです。

独自の本格的なテンプレートエンジンを使用することはできますが、それはやり過ぎかもしれません。多くの場合、PHPでプレゼンテーションロジックを記述していると、ドメイン固有言語が制限されて邪魔になります。

スパゲッティなしで通常のPHPを作成したい場合は、次のようにします。

  1. アクションコードをファイルの先頭または別のファイルに保持します。ここにはアプリケーションロジックのみを配置し、HTMLやテンプレートは使用しないでください。テンプレートによって表示する必要があるこの段階で生成された情報は、ビジネスロジックの負荷の途中で出力されるのではなく、テンプレート部分に渡される変数に入力する必要があります。 print

  2. タグベースのテンプレートの知識を取得し、それをPHPに適用します。(実際にXHTMLを使用しているかどうかに関係なく)「整形式」のXMLを記述しているかのように、HTMLとPHPの両方のプレゼンテーションロジックに対して、正しくインデントされた単一のコード階層を作成します。HTMLを文字列に入れることは絶対に避けてください。

  3. を呼び出すhtmlspecialchars()ためのより簡単な方法を定義します。そうしないと、常に入力するのは非常に面倒であり、常に入力しないと、セキュリティに敏感なエラーが発生する可能性があります。

要約すると、例えば:

<?php
    // active code here
    // do things
    // put any errors in a $errors array

    // this trivial function would presumably be in an include
    //
    function h($s) {
        echo htmlspecialchars($s, ENT_QUOTES);
    }
?>

<body>
    <?php if (count($errors)!=0) { ?>
        <ul id="errors">
            <?php foreach ($errors as $error) { ?>
                <?php h($error); ?>
            <?php } ?>
        </ul>
    <?php } ?>
    ...
</body>

PHPプログラミングの「現実の世界」では、どのような方法が推奨されますか。

ああ、PHPプログラミングの現実の世界では、平均的なプロジェクトには、何も考えずに一緒に投げられたアプローチのミッシュマッシュがあります。現実の世界では、コードは保守不可能で、バグが多く、安全ではありません。業界標準はあらゆる点で破られることになっているので、業界標準を見たくありません。

于 2010-07-10T22:04:02.773 に答える
2

HTMLファイルに含まれるPHPコードの量を最小限に抑えるために、テンプレートシステムを使用することを好みます。PHPをHTMLから完全に分離する方法は実際にはわかりませんが、ビジネスロジック(データベース)をプレゼンテーションロジックから分離するだけで十分だと思います。

私のテンプレートシステムは自家製ですが、グーグル検索を実行することで機能するさまざまなものを見つけることができると確信しています。

于 2010-07-10T20:06:53.177 に答える
2

私の経験によると、PHPとHTMLの分離はまれです

本当です。しかし、PHPコードの多くは、経験の浅い開発者によって作成されています。さらに、PHPは、優れたコードを作成することを推奨していませんが、推奨していません。HTMLとプログラミングコードを混在させる機能は、この例の1つです。

高品質のコードを実行し、それを簡単に保守および拡張できるようにする場合は、テンプレートエンジンなどを使用することを強くお勧めします。両方を混在させると、コードの可読性に大きな影響があり、時間の経過とともに状況が悪化します。リファクタリングは、不可能ではないにしても、苦痛になります。

これで、HTMLをPHPから分離する方法を幅広く選択できます。

  • 最も明白なものは、既存のレイアウトエンジンを使用することです。それらはたくさんあり、いくつかは非常によくできていて、パフォーマンスへの影響は非常に少ないです。

  • 独自のエンジンを作成することもできます。大きなプロジェクトでは(なぜ車輪の再発明をするのか)良い考えではないかもしれませんが、小さなプロジェクトや非常に具体的なものが必要な場合の解決策になる可能性があります。

  • 私がほとんどのプロジェクトで使用する最後の方法は、ビジネスレイヤーからXMLを構築し(PHPではXMLのシリアル化は非常に簡単です)、XSLTを使用してこれをHTMLページに変換することです。これにより、保守がはるかに簡単で理解しやすいWebサイトを作成できます。また、必要に応じて、プログラムで(HTMLページの代わりにXMLをロードして)Webサイトのデータにアクセスできます。一方、パフォーマンスが大幅に低下するため、1秒あたり数千のクエリを実行する大規模なWebサイトには適していません。

于 2010-07-10T20:20:10.147 に答える
0

ほとんどのコードはPHPとHTMLの文字列で始まり、大規模な書き直しの間にテンプレートシステムに進化します。コンテンツをロジックから事前に分離するには、チーム間の設計、計画、およびコミュニケーションが必要です。データ形式としてPHP配列の代わりにXMLまたはJSONを使用すると、これが簡単になります。

于 2013-03-04T20:28:20.307 に答える
0

<?phpHTMLの間にPHP?>タグを追加するだけで、HTML内でPHPを混同したり、その逆を行うことができます。

<!DOCTYPE html> 
  <head>         
<title>Hello world as text</title> 
  </head> 
    <body>                 
        <?php                 
            echo "<p>Hello world</p>";                 
        ?>         
    </body> 
</html> 

詳細については、https ://stackhowto.com/how-to-combine-html-and-php/をご覧ください。

于 2020-12-04T21:26:41.720 に答える