第1回 PHPでオブジェクト指向実践1 - OOP講座

PHP基礎編

がる先生の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_stringFILE_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_stringFILE_APPEND);
 65    }
 66  
 67    
// プロパティ領域
 68    
private $data_;    // 1メッセージの全情報がhash配列で入っている
 69    
private $filename_// 書き出し先のファイル名
 70  
 71  
// end of class

がる先生では、今回はここまでとします。
次回はこのクラスを使って、read部分の作成と、そうしてなによりも「どうやって項目を楽に追加するのか」という部分に迫ってみましょう。


  • がる先生

本名:古庄 道明
株式会社 格子組 代表取締役: http://www.grid-works-guild.net
M-Frネット: http://www.m-fr.net/

現役のエンジニア。コンサルティングからシステム設計、ネットワークにセキュリティと、守備範囲は比較的多岐に渡る。「技術の基本は、その技術がない時の"困ってる"が根っこ」をモットーに、いい加減いい歳なのをうまく逆手にとって、古い話から現代へ歴史をたどるように教えるのが持ち味。

ご意見・感想フォーム

今回の「がる先生のOOP講座」への評価・ご意見があればご記入下さい。

評価:
ご意見・感想:



Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

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

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)