第1回 PHPでオブジェクト指向実践1 - OOP講座
がる先生のOOP講座
Lecutures on PHP
第1回 PHPでオブジェクト指向実践1 (その4)
さてさて。またしても脱線してしまいましたので、本題に戻りましょう。
set_from_cgiformの実装が終わったので、お次はwriteです。まずコメント部分だけ書き出してみましょう。
list 9
bbs_data.inc より
1
// ファイルにデータを書き出す
2 public function write()
3 {
4 // データの配列を取得する
5 // 文字列を作成する
6 // 書き出す
7 }
こんな所ですかね。では、list 1を回顧しつつ、実装してみましょう。
list 10
bbs_data.inc より
1
// ゲッター
2 protected function get_data()
3 {
4 return $this->data_;
5 }
6
7 // ファイルにデータを書き出す
8 public function write()
9 {
10 // データの配列を取得する
11 $data = $this->get_data();
12
13 // 文字列を作成する
14 // -----------------
15 // データを合成する
16 $wk = array();
17
18 // エスケープ処理
19 foreach($data as $key => $val) {
20 // 文字列内のダブルクォートを二重にした上で、全体をダブルクォートで囲む:rfc4180
21 $wk[$key] = '"' . str_replace('"', '""', $val) . '"';
22 }
23
24 // 文字列を,で連結する
25 $write_string = implode(',', $wk) . "\n";
26
27 // 書き出す
28 file_put_contents($bbs_data_filename???, $write_string, FILE_APPEND);
29 }
ですので、「bbs_dataクラスに書き込みまでをお願いする」ので、「どこに書いて欲しいか」はこちらで指定をしなければいけません。
というわけで、list 4を思い出しつつ、少し使い方を変えましょうというか、必要なものを渡して貰うようにしてみましょう。
list 11
write.php より
1
//
2 // formデータ(cgi requestデータ)から「掲示板の1メッセージの情報」を受け取る
3 // -----------------------------
4 // 「掲示板の1メッセージの情報」をクラスの中に入れる
5 掲示板の1メッセージの情報->set_from_cgiform();
6
7 // 「1メッセージの情報」をファイルに書き込む
8 掲示板の1メッセージの情報->set_filename($bbs_data_filename);
9 掲示板の1メッセージの情報->write();
クラスの良いところの一つは「必要なものを、必要になってから追加する事が(比較的)容易である」という事です。
では、set_filenameメソッドを実装してみましょう。
とは言っても実際にやる事はほんの少しなのですが。
list 12
bbs_data.inc より
1
// セッター
2 public function set_filename($s)
3 {
4 $this->filename_ = $s;
5 }
6
7 // プロパティ
8 private $filename_; // 書き出し先のファイル名
また、上述に合わせて、writeメソッドの中も一部書き換えになります。
最終的な、write.php(の一部)とbbs_data.incは、こんな感じになります。
list 13
write.php より
1
// bbs_dataクラスを使う準備
2 $bbs_obj = new bbs_data();
3
4 // 「掲示板の1メッセージの情報」をクラスの中に入れる
5 $bbs_obj->set_from_cgiform();
6
7 // 「1メッセージの情報」をファイルに書き込む
8 $bbs_obj->set_filename($bbs_data_filename);
9 $bbs_obj->write();
list 14
bbs_data.inc
1
class bbs_data
2 {
3 // セッター
4 protected function set_data($a)
5 {
6 $this->data_ = $a;
7 }
8 public function set_filename($s)
9 {
10 $this->filename_ = $s;
11 }
12
13 // ゲッター
14 protected function get_data()
15 {
16 return $this->data_;
17 }
18 public function get_filename()
19 {
20 return $this->filename_;
21 }
22
23 // formデータから情報を取り込む
24 public function set_from_cgiform()
25 {
26 // 取得対象を決定する
27 $targets = array('email', 'handle', 'title', 'body');
28
29 // formデータから情報を受け取る
30 $data = array();
31 foreach($targets as $target) {
32 // XXX エラー抑止演算子は後で再考察
33 $data[$target] = @$_POST[$target];
34 }
35
36 // データをプロパティに保存する
37 $this->set_data($data);
38
39 //
40 return true;
41 }
42
43
44 // ファイルにデータを書き出す
45 public function write()
46 {
47 // データの配列を取得する
48 $data = $this->get_data();
49
50 // 文字列を作成する
51 // -----------------
52 // データを合成する
53 $wk = array();
54 // エスケープ処理
55 foreach($data as $key => $val) {
56 // 文字列内のダブルクォートを二重にした上で、全体をダブルクォートで囲む:rfc4180
57 $wk[$key] = '"' . str_replace('"', '""', $val) . '"';
58 }
59
60 // 文字列を,で連結する
61 $write_string = implode(',', $wk) . "\n";
62
63 // 書き出す
64 file_put_contents($this->get_filename(), $write_string, FILE_APPEND);
65 }
66
67 // プロパティ領域
68 private $data_; // 1メッセージの全情報がhash配列で入っている
69 private $filename_; // 書き出し先のファイル名
70
71 } // end of class
では、今回はここまでとします。
次回はこのクラスを使って、read部分の作成と、そうしてなによりも「どうやって項目を楽に追加するのか」という部分に迫ってみましょう。
その他の記事も見る
- 第1回 PHPでオブジェクト指向実践1
- 第2回 PHPでオブジェクト指向実践2
- 第3回 configを取り出してみよう
- 第4回 処理するエリアを切り分けてみよう~理論編~
- 第5回 処理するエリアを切り分けてみよう~実装編~
- 第6回 読み書き削除の実装例
- 第7回 保存先の変更
- 第8回 保存先の変更 その2
- 第9回 保存先の変更 その3
- 第10回 会員認証
- 第11回 会員認証
- 第12回 会員認証2
- 第13回 オブジェクトの切り方1
- 第14回 オブジェクトの切り方2
- >>「がる先生のOOP講座」一覧ページに戻る
- がる先生
本名:古庄 道明
株式会社 格子組 代表取締役:
http://www.grid-works-guild.net
M-Frネット: http://www.m-fr.net/
現役のエンジニア。コンサルティングからシステム設計、ネットワークにセキュリティと、守備範囲は比較的多岐に渡る。「技術の基本は、その技術がない時の"困ってる"が根っこ」をモットーに、いい加減いい歳なのをうまく逆手にとって、古い話から現代へ歴史をたどるように教えるのが持ち味。





ページのトップへ


kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。