
今回は、その理由を説明するとともに、前回のプログラムをメンテナンスしやすいように、PHP部分と HTML部分を分離していくことにする。
サンプル・プログラム
PHPとHTMLの関係

「PHPが動作する仕組み――HPとは何か/各バージョンのサポート期限」を思い出していただきたいのだが、HTMLはクライアント側で動作するプログラム(スクリプト)、PHPはサーバ側で動作するプログラムである。両者の間にはインターネットで区切られており、互いに直接操作することができないようになっている。下図をご覧いただきたい。

最初に変数 $_GET['year'] があるかどうかを探す。前回説明したように、$_GET変数 は FORM タグから渡された値が入っているのだが、初回は FORM タグは表示されておらず、何も入力されていないので、かならず FALSE が戻る。そこで date を使って現在年を変数 $year に代入する。
次に、①変数 $year を関数 #isLeapYear2 に渡し、閏年かどうかの結果を変数 $result に代入する。

続いて HTML部分に入る。メイン・プログラムの中でHTMLファイルを生成し、これをクライアント側に送って表示させる。
②HTML部分は、ほとんどが普通のHTML文なのだが、[= ... ?>blue] で囲まれた部分にPHPの変数 $year と $result が入っている。この部分は、変数に代入してある値に置き換わる。
たとえば $year = 2024 なら、$result = '2024年(令和6年)はうるう年です.' となり、
のようなHTML文になる。
―(中略)―
2024年(令和6年)はうるう年です.
③このHTML文をクライアントへ送信する。④クライアント側(ブラウザ)では、送られてきたHTML文を表示する。
ここで、初めてクライアント側の画面に表示される。

⑤クライアント側で西暦年 year の値を入力し、⑥「調べる」ボタンをクリックすると year の値をサーバへ送信する。
⑦サーバ側では、ふたたびメイン・プログラムを上から順に実行し、$_GET変数 を使って year の値を取得し、#isLeapYear2 に渡し、閏年かどうかの結果を変数 $result に代入する。
以降、この作業の繰り返しとなる。

お気づきのように、「調べる」ボタンをクリックするたびに、サーバ側のPHPプログラムはHTMLを作成し直し、クライアントへ送信する。つまり、「調べる」ボタンをクリックするたびに、ブラウザの画面は書き換えられる。これがデスクトップアプリと大きく違うもう1つのポイントである。
ただ、書き換えの部分がほとんどないこと(年号と結果表示だけ)、ブラウザの表示が高速であることが相まって、人間の目には書き換えによるちらつきが見えることはない。

PHPに限らず、ブラウザアプリケーションの多くは、このような流れでクライアント側とサーバ側とで処理を分業していることを覚えておいてほしい。
では、プログラムを "isleap2.php" の中を見てみよう。
isleap2.php
1: <?php
2: /**isleap2.php
3: * 閏年かどうか判定する(その2)
4: * PHP部分とHTML部分を分離
5: *
6: * @copyright (c)studio pahoo
7: * @author パパぱふぅ
8: * @動作環境 PHP 7/8
9: * @参考URL https://www.pahoo.org/e-soul/webtech/php01/php05-02.shtm
10: */
11:
12: /**
13: * 指定した年がうるう年かどうか判定する.
14: * 早期リターン版.
15: * @param int $year 西暦年
16: * @return bool TRUE:うるう年/FALSE:平年
17: */
18: function isLeapYear2($year) {
19: if ($year % 400 == 0) return TRUE;
20: if ($year % 100 == 0) return FALSE;
21: if ($year % 4 == 0) return TRUE;
22: return FALSE;
23: }
24:
25: // メイン・プログラム =====================================================
26: // 年を取得する
27: if (isset($_GET['year']) === FALSE) {
28: $year = date('Y'); // 初回起動時は現在年を代入
29: } else {
30: $year = $_GET['year'];
31: }
32:
33: // うるう年かどうか判定する
34: if (isLeapYear2($year) == TRUE) {
35: $result = sprintf('%s年はうるう年です.', $year);
36: } else {
37: $result = printf('%s年は平年です.', $year);
38: }
39: /*
40: ** バージョンアップ履歴 ===================================================
41: *
42: * @version 2.0.0 2024/02/14 HTML分離版
43: * @version 1.0.0 2004/10/04 初版
44: */
45: ?>
前回説明したように、<?php ... ?>で囲まれた部分をPHPプログラムとして解釈する。関数 #isLeapYear2 は前回のものと同じだ。
isleap2.php
47: <!-- HTML部 ============================================================ -->
48: <!DOCTYPE html>
49: <html lang="ja">
50: <head>
51: <meta charset="UTF-8">
52: <title>閏年かどうか判定する(その2)</title>
53: </head>
54: <body>
55: <form action="isleap2.php" method="get">
56: 西暦年号=
57: <input type="text" name="year" id="year" size="10" value="<?= $year ?>">
58: <input type="submit" name="exec" id="exec" value="調べる">
59: </form>
60: <div>
61: <?= $result ?>
62: </div>
63: </body>
64: </html>
ブラウザで右クリックしてソースを表示すると分かるが、PHPプログラムの痕跡は一切ない。<?= ... ?> で囲まれた部分は PHP変数の内容に置き換わっている。上図のように、クライアント側にはHTML部分しか渡さないのだ。
また、このように PHP部と HTML部を二分することで、プログラムの見通しがよくなり、メンテナンス性が向上する。
参考サイト
- オリンピック・イヤーは閏年(うるう年)か?:ぱふぅ家のホームページ