できるだけシンプルに書いて処理の流れを把握しやすくしていきます。
■処理側(オブジェクト作成側)index.php
//クラスファイル呼び出し
include("./inc_std.php");
//オブジェクト作成
$obj= new std;
//受け取ったデータがあれば表示用にエンティティ変換を施す
$cat= '';
foreach ($obj->data as $key=>$value){
$obj->data[$key]= htmlspecialchars($value);
$cat.= "$key: {$obj->data[$key]}<br>\n";
}
//少なくとも最初にページを開いたときにはまだ送信データがないので値は未定義につき初期化しておく
if (!isset($obj->data['POST_DATA'])) $obj->data['POST_DATA']= '';
//結果表示
$obj->msg(<<<EOT
<html><head>
<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">
<title>結果表示</title>
</head><body>
<hr>
<h2>入力データ</h2>
{$cat}
<hr>
<form action="{$_SERVER['SCRIPT_NAME']}" method="post">
<input type="text" name="POST_DATA" value="{$obj->data['POST_DATA']}">
<input type="submit" value="送信">
</form>
</body></html>
EOT
);
?>
値を入力して送信ボタンを押すと、同じPHPで受け取って表示するスクリプト
何度も入力して表示を繰り返すPHPです。
「<」や「&」などが入力されても正しく表示できるようにhtmlspecialchars()関数を使っています。
$catは最初に空文字を代入しておかないとループ内で未定義値と文字を連結してしまったという警告が出てしまいます。
存在しない変数をいきなり表示させようと思って記述したら未定義の警告が表示されます。
事前に必ずif (isset(変数))でチェックして必要に応じて空文字を代入などして警告が出ないように回避させます。
連想配列では、$hash[key]と書くより$hash['key']と書くべきです。
偶然、定数文字とかぶったりしたら置換される恐れがあることと、'key'と書くことでキー名の始まりと終わりを明確にしたほうが処理が速いです。
文字の中に変数を埋め込むときは必ず{括弧}でくくります。
前後が空白などの場合は不要ですが、使って損はありません。
【例1】"abc{$val}def"
【例2】"abc{$_HOGE[$key]}def"
ヒアドキュメントを使うと構成イメージがわかりやすくなります。
return <<<EOT
複数行をリターン
複数行をリターン
複数行をリターン
EOT;
$val= <<<HTML
複数行を代入
複数行を代入
複数行を代入
HTML;
func(<<<PARAM
複数行を関数に渡す
複数行を関数に渡す
複数行を関数に渡す
PARAM
);
$array= array(<<<EOT
複数行を配列に代入
複数行を配列に代入
EOT
, <<<HTML
複数行を配列に代入
複数行を配列に代入
HTML
);
私はEOT(エンドオブテキスト)を多用しますがこれは好みです。自由で使いやすいワードを持っておくとしっくりきます。
EOTなどのワードの行末は変な書き方するとエラーが出ます。
■クラスファイルinc_std.php
class std
{
var $data= array();
//コンストラクタ
function std()
{
//食べやすくする
foreach ($_REQUEST as $key=>$value) $this->data[$key]=
mb_convert_encoding($value, "EUC-JP", "SJIS,EUC-JP,UTF-8,JIS");
}
function msg($html) //出力
{
echo mb_convert_encoding($html, "SJIS", "EUC-JP,SJIS"); exit;
}
}
?>
処理は日本語EUC、表示はシフトJISを想定しています。
当然呼び出し側(index.php)スクリプトは日本語を使っているのでファイル文字コードは日本語EUCということになります。
もし呼び出し側(index.php)ファイルの文字コードがシフトJISなら
クラスファイル9行目"EUC-JP"を"SJIS"に換えることで対処できます。
ただし、処理をシフトJISでやるのは実践的ではないので動きを見る程度で使うくらいにとどめておいたほうがいいです。
クラスファイルではコンストラクタで処理用の文字コード(日本語EUC)に変換しておいて、オブジェクト作成側では日本語EUCで処理をすすめていき、最後にページを表示するためmsg()関数と通るときにシフトJISに変換されて出力されて処理が終了します。