第1回 PHPでオブジェクト指向実践1 - OOP講座
がる先生の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;
と書くやり方です。
賛否はあろうかと思うのですが、いくつかの理由から、筆者は「かならずセッター(ゲッター:合わせてアクセッサと呼称します)を通す」ようにしておりますので、そのあたりご了承いただければと思います。
回を重ねるタイミングで、理由を説明できるかと思いますので。





ページのトップへ


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