パフォーマンスの面では、何が良いでしょう。 PHPを使用してすべてのHTML出力をエコーするため、さまざまな作業コードや変数を使用したり、ドキュメント全体でHTMLをphpに定期的にエスケープしたりできます。
読みやすさの問題があるかもしれませんが、心配する必要はありません。
皆さんありがとう!
例1
echo '<html>',
'<body>',
'The content of the ',$container,' element is displayed in your ', $other_container,
'</body>',
'</html>';
OR
<html>
<body>
The content of the <?php echo $container; ?> element is displayed in your <?php echo $other_container; ?>
</body>
</html>
最も読みやすいと思うのは、そのすべてです。もちろん、これは状況ごとに異なります。ページ全体を実行していて、PHPが含まれていない大きなセクションがある場合は、PHPプレーンHTMLを記述しますが、PHP変数が多いセクションがある場合は、すべてPHPで行います。
例えば:
<table>
<tr>
<td colspan="<?php echo $numCols; ?>">
<?php echo $a; ?>, <?php echo $b; ?>, and <?php echo $c?>
</td>
</tr>
</table>
対:
<?php
echo "<table>"
. "<tr>"
. "<td colspan=\"" . $numCols . "\">"
. $a . ", " . $b . " and " . $c
. "</td>"
. "</tr>"
. "</table>"
; ?>
または
<?php
echo "<table>
<tr>
<td colspan='{$numCols}'>
{$a}, {$b}, and {$c}
</td>
</tr>
</table>";
?>
printf
も忘れないでください
<?php
printf("<table>"
. "<tr>"
. "<td colspan=\"%d\">%s, %s and %s</td>"
. "</tr>"
. "</table>"
, $numCols
, $a
, $b
, $c
);
?>
読みやすい方
パフォーマンスの違いは、他のほとんどの問題に比べてごくわずかです。ここで最初の問題は間違いなく読みやすさです。
引用してみましょう マニュアル :
もちろん、ここに挙げた例は不自然ですが、大きなテキストブロックを出力するために、PHP解析通常、modeはecho()またはprint()を介してすべてのテキストを送信するよりも効率的です。
しかし、他の人の声に耳を傾け、この種のマイクロ最適化を避け、より読みやすいものを選択してください。
3番目のソリューションを提案できますか?テンプレートエンジンについて聞いたことがありますか?これらは、コードとプレゼンテーションを明確に分離するのに役立ちます。これにより、通常、メンテナンスしやすいコードがよりきれいになります。人気のあるそのようなテンプレートエンジンは、例えば smarty 、しかし、数百の異なる強さがある。
どちらを使用するかは、アプリの全体的な速度とは無関係です。
そうは言っても、気にしないと言ったのは知っていますが、2番目のものを使用してください。そして読みやすさはhugeです。
私はこれのパフォーマンスについては知りませんが、PHP内で「Heredoc」と呼ばれるものを使用することもできます。
ニックフの例:
<table>
<tr>
<td colspan="<?php echo $numCols; ?>">
<?php echo $a; ?>, <?php echo $b; ?>, and <?php echo $c?>
</td>
</tr>
</table>
になる:
<?php
echo <<<EOT
<table>
<tr>
<td colspan="$numCols">
$a , $b, and $c
</td>
</tr>
</table>
EOT;
?>
最終的に読みやすさは主観的なものだと思いますので、あなたの走行距離は変わるかもしれません!
ルース
マイクロ最適化の領域に分類されます。時間の大部分は、作業を開始するPHPエンジンの初期化に費やされます。
したがって、数万行(またはそれ以上)のオーダーがない限り、それを気にする必要はありません。
さらに、PHPを使用して印刷し、PHPを使用して同じことを行うCプログラムを呼び出す100万行の小さなテストを行いましたが、違いはごくわずかでした。
もう少し情報。
2番目の例で行われているのは、PHPを「オン/オフ」にしていることです。正確に何が起こっているかではありませんが、この例では適合しています。
あなたがもっと心配するべきことは、そのコードはそれの周りに多くのロジックを持つことになるでしょうか?その文字列をさらに多くの文字列に分割したり、別の場所に配置したりしますか?これはMVCアプリケーションのビューですか?
1と2の場合、どちらの方法でもうまくいきません。しかし、3の場合、これらの理由により、方法2を使用します。
MVC Webアプリケーションのビューは、ほとんどがhtml/cssです。だから、私はそれが正しくフォーマットされていることを確認し、エディタでHTMLの色付けを確認したい。それはプラスです。
プロジェクトを引き継いでいる次のプログラマが連続殺人犯であるかのようにコードします。つまり、言及した2番目のオプションを使用します。
これは、パフォーマンスの問題よりも読みやすさとメンテナンスの問題と考える必要があります。
したがって、オプション2にはいくつかの具体的な利点があります。
パフォーマンスの観点からは重要ではありません。コードの可読性は重要であり、パフォーマンスの違いのわずかな割合で何も変わりません。
通常、生のHTMLバージョンは最も読みやすいです(そしておそらく価値があるものに対しても最高のパフォーマンスを発揮します-しかし、価値があるのは何もありません)。これは驚くことではありません:PHPはHTMLテンプレート言語であり、ポイント全体が言語構文レベルでHTMLをインターリーブしています。
Nickfのコードを見て、読みやすくする方法を確認してください。インデントは重要です!各PHP制御構造内にもインデントのレベルを入れてください。そうすれば、それらを追跡できます。例えば:
<?php if ($error) { ?>
<p> Oh no, error! </p>
<?php } ?>
最後に、例の$ containerなどのコンテンツを出力するときは、常にhtmlspecialchars()する必要があります。そうしないと、他のすべてのPHP初心者(そして残念なことに、多くのプロの開発者でさえも)これは、コンテンツを出力するためにどの方法を使用するかに関係します。
Htmlspecialcharsは非常に迷惑な長い関数名であるため、独自のショートカット関数を定義してみてください。
<?php
function h($s) {
echo(htmlspecialchars($s, ENT_QUOTES));
}
?>
<ul>
<?php foreach ($things as $thing) { ?>
<li> <?php h($thing['name']) ?> </li>
<?php } ?>
</ul>
私はphp heredoc 関数を使用することを好みます。この方法で、文字をエスケープする必要はありません。例:
<?php
$title = "heredoc is cool!!!";
$mySite = "http://www.php.net";
echo <<<LOL
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title> $title </title>
<link rel="shortcut icon" href="$mySite/favicon.ico">
<link rel="search" type="application/opensearchdescription+xml" href="$mySite/phpnetimprovedsearch.src" title="Add PHP.net search">
<link rel="alternate" type="application/atom+xml" href="$mySite/releases/feed.php" title="PHP Release feed">
<link rel="alternate" type="application/atom+xml" href="$mySite/feed.atom" title="PHP: Hypertext Preprocessor">
<link rel="canonical" href="$mySite/manual/en/language.types.string.php">
<link rel="shorturl" href="$mySite/types.string">
<link rel="contents" href="$mySite/manual/en/index.php">
<link rel="index" href="$mySite/manual/en/language.types.php">
<link rel="prev" href="$mySite/manual/en/language.types.float.php">
<link rel="next" href="$mySite/manual/en/language.types.array.php">
LOL;
?>
注意:
Heredocテキストは、二重引用符なしで、二重引用符で囲まれた文字列のように動作します。つまり、ヒアドキュメント内の引用符をエスケープする必要はありませんが、上記のエスケープコードは引き続き使用できます。変数は展開されますが、文字列と同様に、ヒアドキュメント内で複雑な変数を表現する場合と同じ注意が必要です。
小さなビットについては、配列をループしてリストを生成するときのように、すべてをPHP文字列に入れます。しかし、マークアップの大きな山については、PHPそして必要に応じてPHPにドロップします。
これは主に、保守性を最適化することを好むためです。 htmlに適切な構文強調表示が適用されていると、何が起こっているかを見るのが速くなるだけでなく、コードの読み取りの欠陥に起因するミスが発生しにくくなるためです。
本当に最善の方法はありません。上記の内容と一貫性を保ち、他の方法がより良い処理方法となる可能性がある状況に目を開かないようにします。
HTMLの内部にPHPを配置しないでください。ロジックをビューと混同しているため、プロジェクトが煩雑になります。
他の人が言ったように、htmlに出力する場合は、<?php echo $whatever; ?>
大量の情報を出力する必要がある場合は、出力バッファリングを調べてください。
後者ははるかに読みやすいです。また、より簡単に編集できます(たとえば、HTMLで引用符をエスケープする必要はありません)。また、特にデバッグ目的で、手間をかけずに空白を保持することをお勧めします。
私はほとんどPHP=がprint()
とecho()
を有効にしてHTML文字を自動的に変換し、人々がそれらを使用してHTMLを生成するのを止めることを望みます。