ツイート
シェア
LINEで送る
B! はてぶでブックマーク
Pocketでブックマーク
RSSフィード

PHP, HTMLを出力する3つの方法。echo, ヒアドキュメント, バッファリング。

php
イラストダウンロードサイト【イラストAC】
の画像をもとに加工しています。

PHPのHTML出力には3つの方法があります。はじめに思いつくのは "echo" ですね?

でもechoは複数行書くのに向いていません。そこでecho以外にも、ヒアドキュメント、バッファリングの方法があります。

それぞれのメリット・デメリットをご紹介しながら見ていきます。

echo

PHPでHTMLを出力する方法で最初に思いつくのは、"echo" だと思います。

echoを使えば、他の方法はいらないと言えなくもないです。インラインのCSSやJavaScriptのコードだって出力できます。

しかし、echoは複数行の文字列を出力するのに向いていません。

<?php
echo "<div>";
echo "    <ul>";
echo "        <li>sample 1</li>";
echo "        <li>sample 2</li>";
echo "    </ul>";
echo "</div>";

プログラムを実装する人はいいでしょう。コピー&ペーストで作業すればそんなに苦になりません。

でも修正する人、読む人はどうでしょうか? 左にechoがたくさん出てきてスマートじゃありません。そして読みにくい。

なので、echoは複数行の出力には向きません。でも使い道はあります。たとえばこんな感じ。

<?php
?>
<div class="<?php echo $class_type; ?>">
<ul>
<li>sample 1</li>
<li>sample 2</li>
</ul>
</div>

echoに向いているのは、ピンポイントの動的な出力です。この例では、class_typeの値を変更して表示の装飾を動的に変更することができます。

ここで気づいたでしょうか?

例は2つとも.phpファイルに書かれたコードです。でも、2番目のコードは、HTML文がそのまま書かれていて、htmlファイルに書く方法と同じです。

この書き方ができるのが、最後に紹介する方法で、この方法はWordpressのテーマのテンプレートファイルと同じです。

echoは、複数行のコード出力に向きませんがテンプレートファイルにも向きません。

最近のプログラムは、フレームワークでテンプレート化されているので、echoを使った複数行の出力を見ることはありません。

メリット

ピンポイントの動的出力に向いている。

HTMLファイルに書ける。

デメリット

まとまった文字列の出力(テンプレート)に向かない。

なぜ、ソースコードが読みにくいとダメなのか?

ここでちょっと話をそらします。なぜ、ソースコードが読みにくいとダメなんでしょうか?

プログミングを仕事にしている人のあいだでは、読みにくいソースは正しく動くけど、プログラマ失格の烙印を押されます。

プログラマの書くコードは、

  • 読みやすさ
  • 修正しやすさ

も求められます。彼らは大げさじゃなく、1分、1秒にお金が発生していることを気にします。

フリーランスはなおさらでしょう。またトラブル対応では、数秒で数十億、数百億円が消えるかもしれません。

ぼくが新人の頃よく言われました。

先輩エンジニア
エンジニア
バグを出してもいいから読みやすいプログラムを書け!
先輩エンジニア
エンジニア
バグの多いものはフォローできるけど、読みにくいものはフォローできない。

もう15年以上の話ですが、今でも通用すると思います。

プログラミングの進化は、読みやすいプログラムを簡単に速く書くための進化です。

コーディング規約のための標準化団体の設立や、整形ツールの自動化などもそうやって進化してきました。

そして読みやすいプログラムは、無駄な処理がない、いいプログラムと言われます。

いいプログラムは、バグのないものより読みやすいプログラム。

だからと言って、どうでもいいバグを出してもいいというわけではありません。バグは少ない方がいいのは当たり前です。

読みにくいコードを書くよりバグがあった方がマシだという意味。

(かと言って、本当に大量にバグを出すと別の意味で怒られる。)

ヒアドキュメント

話を戻します。

以前は、まとまった文字列やHTMLはヒアドキュメントで出力するのが主流でした。しかし、ある理由からこれも見られなくなります。

理由はあとで説明します。まずはヒアドキュメントの出力方法を見てみましょう。

<?php
$foo = new foo();
$name = 'MyName';
$is_flag = true;

if($is_flag) {
    $message = <<<EOT
My name is "$name". I am printing some $foo->foo.

Now, I am printing some {$foo->bar[1]}.

This should print a capital 'A': \x41
EOT;
    echo $message;
}
?>

もちろんですが、変数やクラスのメンバの値も出力できます。

"EOT"は、アルファベット文字列であれば何でもいいです。大文字3文字のEOTが一般的です。

No Image Person
まとめて書けるから便利だ!

と思うところですが、"<<<EOT"の中身、そしてEOTの終端はインデントがありません。

これが使われなくなった理由です。

ヒアドキュメントは、整形ツールが対応していないことがあり、ツールを実行すると勝手にインデントが付けられてしまいます。

そうなると勝手に出力内容が変えられます。また、EOTの終端(EOT;)は、インデントを付けないのがPHPのルールなので、インデントが付くとERRORになります。バグになる。

このことから、今ではあまり使われません。そこで使われるようになったのがバッファリングです。

メリット

まとめて文字列が出力できる。

デメリット

ソースコードの成形ツールが対応していないことがあり、バグになる。

今ではあまり使われない

バッファリング

バッファリングは、サンプルを見たほうが早いです。

main.php
<?php
require_once "load-template.php";

load_template("template.php");
load-template.php
<?php

function load_template($file){
    ob_start();
    require $file;
    $html = ob_get_contents();
    ob_end_clean();

    echo $html;
}
template.php
<?php
?>
<div class="<?php echo get_class_type(); ?>">
<ul>
<li>sample 1</li>
<li>sample 2</li>
</ul>
</div>

ob_start()

バッファリングを開始します。ここからあとに記述される出力コードはすべてバッファされます。

バッファ(buffer)

データを一時保存すること。そのデータ領域のこと。

PHPコード内の場合

"<?php"と"?>"で囲まれたところはPHPコードを書くところです。この中では、PHPコードを実行して、echoなどを使って標準出力された内容がバッファに保存されます。

PHPコードの外の場合

PHPコードじゃないところは、書かれた内容がそのままバッファに保存されます。

PHPコードの終わりのマーク(?>)が開始の合図、PHPコードの始まりのマーク(<?php)が終了の合図。

ここにまとまったHTML文を書きます。echoを使ったピンポイントの動的処理も入れることができます。もちろん、echoの結果が含まれるHTML文がバッファに保存されます。

バッファに保存する内容はすべてtemplate.phpに書いて、テンプレートファイルをrequireしています。

このようにしてPHPコードのテンプレート化します。

ob_get_contents()

バッファに保存された内容を返します。この内容をあとでechoを使って一気に出力します。

ob_end_clean()

バッファリングを終了します。ここでは、終わりと同時にバッファをクリアします。

  • バッファに出力する内容を順次保存できて、あとでまとめて出力できる。
  • テンプレート化できる。

まとめ

PHPでhtmlを出力する方法を3つご紹介しました。

でも実際に使われるのは限られています。そして使い方も限定されるので、すべてを覚える必要はないでしょう。

よく見られるのはピンポイントのechoで、ふだんは目にしないけれど深く突っ込んでいくとよく使われているのがバッファリングです。

  • まとめて出力する場合はバッファリング
  • ピンポイントで出力する場合はecho
  • ヒアドキュメントは使わない
前の投稿
PHP array_filter, 配列をフィルタリングする。データの選別。
PHP, HTMLのテンプレートを作る方法。テンプレートファイルを読んでHTMLを作る。
次の投稿
コメントを残す

*