PHPとHTMLの関係

(1/1)
PHPでうるう年(閏年)かどうか判定する(その2)
デスクトップアプリを作ったことがある方なら、前回のプログラム "isleap.php" を見て、なぜ GUI部分から直接値を取得しないのか――
つまり、HTML文の FORM タグにある <input type="text" name="year" ... > から直接値を取得しないか疑問に感じた方がいるだろう。じつは、サーバ側で動かすPHPプログラムでは、FORMタグの値を直接取得することができない
今回は、その理由を説明するとともに、前回のプログラムをメンテナンスしやすいように、PHP部分と HTML部分を分離していくことにする。

目次

サンプル・プログラム

PHPとHTMLの関係

サンプル・プログラムの動きは、前回のプログラム "isleap.php" と全く同じである。だが、プログラムの構造が異なる。

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

―(中略)―

2024年(令和6年)はうるう年です.
のようなHTML文になる。
③この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: ?>

前回のプログラム "isleap.php" では HTMLとPHPが混在していたが、分かりやすいようにファイルは1つのまま、書き方を分離したのが今回のプログラム "isleap2.php" である。
前回説明したように、<?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>

このあとがHTML部分である。
ブラウザで右クリックしてソースを表示すると分かるが、PHPプログラムの痕跡は一切ない。<?= ... ?> で囲まれた部分は PHP変数の内容に置き換わっている。上図のように、クライアント側にはHTML部分しか渡さないのだ。
また、このように PHP部と HTML部を二分することで、プログラムの見通しがよくなり、メンテナンス性が向上する。

参考サイト

(この項おわり)
header