php: HTMLを出力する3つの方法

  • -

    シェア
  • ---

    LINEで送る
  • -

    はてなブックマーク
    ブックマーク
  • -

    pocket
  • -

    rss
他言語サイト
翻訳はみつかりませんでした

phpのHTML出力には3つの方法があります。はじめに思いつくのは"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での複数行の出力を見ることはありません。

メリット
ピンポイントの動的出力に向いている
デメリット
まとまった文字列の出力(テンプレート)に向いていない。

php公式ドキュメント

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

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

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

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

も求められます。彼らは、大げさじゃなく1分、1秒にお金が発生していることを気にします。フリーランスはなおさらでしょう。また、トラブル対応では数秒で数十億、数百億円が消えるかもしれません。

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

先輩エンジニア
エンジニア

バグを出してもいいから読みやすいプログラムを書け!
先輩エンジニア
エンジニア

バグの多いものはフォローできるけど、読みにくいものはフォローできない。

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

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

コーディング規約のための標準化団体の設立や、整形ツールの自動化などです。

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

いいプログラムはバグのないプログラムじゃない。読みやすいプログラム。

ヒアドキュメント

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

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

<?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"の中身、そしてEOTの終端はインデントがありません。これが使われなくなった理由です。

今は、ソースコードの整形ツールを使うのが当たり前です。このヒアドキュメントは、整形ツールには対応していないことがあり、ツールを実行すると勝手にインデントが付けられてしまいます。

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

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

メリット
まとめて文字列が出力できる。
デメリット
ソースコードの成形ツールが対応していないことがあり、バグになる。

今ではあまり使われない。

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>
main.php
<?php
require_once "load-template.php";

load_template("template.php");

ob_start()

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

バッファ(buffer)

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

phpコード内の場合

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

phpコードの外の場合

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

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

ここでは、バッファに保存する内容はすべてtemplate.phpに書いて、テンプレートファイルをrequireしています。このようにしてphpコードのテンプレート化を行ないます。

ob_get_contents()

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

ob_end_clean()

バッファリングを終了します。ここでは、終わりと同時にバッファのクリアするものを使っています。

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

php公式ドキュメント

まとめ

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

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

  • まとめて出力する場合はバッファリング
  • ピンポイントで出力する場合はecho

 

最近Webカテゴリでよく読まれている記事です。
post-cta-image
blog image

ドメイン取得の意味が分からない人へ。王道の方法を紹介します。

ドメインの登録業者を選ぶのに悩む必要はないです。サイトを簡単に早く公開するには全くいらないことで、むしろ邪魔です。『お名前.com』というサービスは必ず耳にします。そのお名前.comのメリットとデメリットと一緒に、ドメインの意味が分からない人が一番失敗しないドメインの取得方法を紹介します。

tadtadya.com

_

SNSでも記事を配信しています。
コメントを残す

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

この記事を気に入ったらぜひシェアも!!