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

PHP基礎編

がる先生のOOP講座

Lecutures on PHP

第1回 PHPでオブジェクト指向実践1 (その3)

 このエントリーをはてなブックマークに追加
がる先生

閑話休題。

さて。list 4で概ね使い方が見えてきました。
さほど難しいお作法があるわけでもなさそうで、簡単で使いやすいクラスになったように思われますので、この設計で「classを実装」していきたいと思います。

まず何よりも「現在見えている外枠」を、とっとと作ってみましょう。
クラス名は、このクラスが「BBSのメッセージを表すクラス」で、1インスタンスが「1メッセージ」を表すので。身も蓋もなく「bbs_data」というクラス名にしてみましょう。

…をっと。「インスタンス」ってなんでしょう?
後々きちんと、区別をする必要があったタイミングで説明をしますので。現状ではとりあえず「クラス ≒ インスタンス」と捉えていただいて、そんなに弊害はないと思います。

では、bbs_dataクラスを書いていきましょう。拡張子が.incなのは筆者の好みってだけなので、そのあたりは自由に、或いは現場やフレームワークその他の流儀などに従ってください。

list 5

bbs_data.inc

  1  class bbs_data
  2  
{
  3  
  4    
// formデータから情報を取り込む
  5    
public function set_from_cgiform()
  6    {
  7    }
  8  
  9    
// ファイルにデータを書き出す
 10    
public function write()
 11    {
 12    }
 13  
 14  
// end of class

まずはここまで。「必要なものは、本当にそれを使うその瞬間に書き足す」癖を付けておくと、後々、無駄な労力を費やさないですむようになります。
ゲームですと、一端ここで「セーブ」でもしてみましょう、ってなところでしょうか。


では、まずset_from_cgiformメソッドを実装していきます。
いきなりコードを書くよりは、まずコメントだけで「何をしたいか」書いてみましょう。

list 6

bbs_data.inc

  1  class bbs_data
  2  
{
  3  
  4    
// formデータから情報を取り込む
  5    
public function set_from_cgiform()
  6    {
  7      
// 取得対象を決定する
  8      // formデータから情報を受け取る
  9    
}
 10  
 11    
// ファイルにデータを書き出す
 12    
public function write()
 13    {
 14    }
 15  
 16  
// end of class

うんまぁこんなところですね。
では。ちょいとさかのぼって list 1 を思い出しつつ、実装をしてみます。

list 7

bbs_data.inc

  1  class bbs_data
  2  
{
  3  
  4    
// formデータから情報を取り込む
  5    
public function set_from_cgiform()
  6    {
  7      
// 取得対象を決定する
  8      
$targets array('email''handle''title''body');
  9  
 10      
// formデータから情報を受け取る
 11      
$data array();
 12      foreach(
$targets as $target) {
 13        
// XXX エラー抑止演算子は後で再考察
 14        
$data[$target] = @$_POST[$target];
 15      }
 16  
 17      
//
 18      
return true;
 19    }
 20  
 21    
// ファイルにデータを書き出す
 22    
public function write()
 23    {
 24    }
 25  
 26  
// end of class

がる先生 さて…実はこのままにしますと。
$dataの中身は、set_from_cgiformのメソッドを抜けた時点でどこかに消えてしまいます。
でも、後でwriteで使う事を考えると、それでは困りますよね?
そのために。
クラスのなかで「確保し続けたいデータ」は、クラス内でず~っと有効になる変数「プロパティ」に入れます。
他言語ですと「クラス変数」なんて言い方もしますね。
では、そのように実装をしてみましょう。


list 8

bbs_data.inc

  1  class bbs_data
  2  
{
  3    
// セッター
  4    
protected function set_data($a) { 
  5      
$this->data_ $a
  6    }
  7  
  8    
// formデータから情報を取り込む
  9    
public function set_from_cgiform()
 10    {
 11      
// 取得対象を決定する
 12      
$targets array('email''handle''title''body');
 13  
 14      
// formデータから情報を受け取る
 15      
$data array();
 16      foreach(
$targets as $target) {
 17        
// XXX エラー抑止演算子は後で再考察
 18        
$data[$target] = @$_POST[$target];
 19      }
 20  
 21      
// データをプロパティに保存する
 22      
$this->set_data($data);
 23  
 24      
//
 25      
return true;
 26    }
 27  
 28    
// ファイルにデータを書き出す
 29    
public function write()
 30    {
 31    }
 32  
 33    
// プロパティ領域
 34    
private $data_;    // 1メッセージの全情報がhash配列で入っている
 35  
 36  
// end of class

さて…いきなり見慣れぬものが出てきたかと思いますので。少しかみ砕いて説明をしてみましょう。
まずプロパティですが。クラスの中では

$this->プロパティ名

という書式で、普通の変数と同じように操作ができます。
set_dataメソッドの中で

$this->data_ $a;

とあるあたりが参考例になります。

次に、「セッター」という見慣れぬ名前が出てきたかと思います。
いくつかの書籍やサイトですと、おそらくセッターは用いずに、set_from_cgiform の中で直接、プロパティを操作していると思います。
つまり

$this->set_data($data);

の部分を

$this->data_ $data;

がる先生と書くやり方です。

賛否はあろうかと思うのですが、いくつかの理由から、筆者は「かならずセッター(ゲッター:合わせてアクセッサと呼称します)を通す」ようにしておりますので、そのあたりご了承いただければと思います。
回を重ねるタイミングで、理由を説明できるかと思いますので。



Pick Up Q&A

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

>>続きを読む

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

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