フォームデータの入力を受け取って、適度に処理した後は、必ず最後に出力で終わります。
前回のように入力処理を一ヶ所(コンストラクタ内)で行ったことは、管理・メンテナンスの上で有効なことでした。
もし複数ヶ所でバラバラに入力処理をしてしまったら、バグの入り込む可能性が高くなってしまいます。
データが必ず通ってくる箇所で待ち構えて、確実に処理を施します。
国に入ってくる人に対して入国管理が行われるように、確実に処理をするわけですね。
それと同様に、出力のときも一ヶ所で行うようにします。
最終的にどういうページをどの文字コードで出力するか、複数ヶ所でバラバラにやってしまったらこれまたバグの入り込む可能性が高くなってエレガントじゃありません。
データが必ず出て行く箇所で待ち構えて、確実に処理を施して出力して終了させます。
国から出て行く人に対して出国管理が行われるように、確実に処理をするわけですね。
■出力のバリエーションを出す(inc_std.php)
class std
{
var $data;
var $opt;
function std($opt=array())
{
//ここにコンストラクタで行う処理を書く
}
function msg($html) //そのまま出力
{
echo mb_convert_encoding($html, "SJIS", "EUC-JP,SJIS"); exit;
}
function tplA($msg)
{
$this->msg(str_replace("%BODY%", $msg, file_get_contents("./template-a.html")));
}
function error($msg) //エラー用テンプレートを読み込んでメッセージを置換
{
$this->msg(str_replace("%BODY%", $msg, file_get_contents("./error.html")));
}
}
?>
■オブジェクト作成側の出力例1
include("./inc_std.php");
$obj= new std;
$obj->msg(<<<EOT
<html>
<head>
<title>タイトル</title>
</head>
<body>
ここに書いたHTMLが
テンプレートを使わずそのまま出力される
</body>
</html>
EOT
);
?>
■オブジェクト作成側の出力例2
include("./inc_std.php");
$obj= new std;
$obj->tplA(<<<EOT
テンプレートAを使って
ここに書いたコンテンツが出力される
EOT
);
?>
■オブジェクト作成側の出力例3
include("./inc_std.php");
$obj= new std;
if (true) $obj->error("エラー用テンプレートを使ってここに書いた内容が出力されて処理が終了");
?>
例1では、msg()関数を直接使って「文字コードを出力用に変換」して「処理を終了」させている。
例2では、テンプレート「template-a.html」を読み込んで、テンプレート内のキーワード「%BODY%」部分を渡した内容に置換して最終的にmsg()関数に渡している。
msg()関数では例1のことが行われている。
例3では、エラー表示用テンプレート「error.html」を読み込んで、以下例2と同じ
ということで出力は最終的にはmsg()関数を呼んでいるので一ヶ所で画面表示用の文字コードに変換して処理を終了させていることになる。
出力に特化した内容で書いていきましたが、表示内容をhtmlspecialchars()関数を使ってエンティティ変換する場合にはタグと混じる前に施すことになります。