【PHP応用】 オブジェクト指向とは
この記事では、
オブジェクト指向の概略を説明します。
1.オブジェクト指向は、システムにおける共通処理・変数を「クラス」という括りに定義する(まとめる)ことから始まる。
2.クラスには「メソッド」と「プロパティ」が定義できる。
3.クラスを「インスタンス化」すると「オブジェクト」ができる。
4.メソッドやプロパティはオブジェクトに紐づく(例外有)ので、
呼び出す際は、どのオブジェクトのメソッドやプロパティか、指定する。
手続き型コードの限界
以下の例1では、
引数の値を変更し、文字列と連結した戻り値を返す関数「changeValue1」と、
引数の内容を表示する関数「display」の2つがあります。
結果は
「変更後の値:200」
と表示されます。
例1
function changeValue1($x){ $msg = “変更後の値:”; $y = $x + 100; return $msg . $y; } function display($x){ echo $x; } $x=100; $y = changeValue1($x); display($y);
似たようなプログラムをさらに2つ考えてみましょう。
結果はそれぞれ
例2は「2倍した値:200」
例3は「変更後:55」
と表示されます。
例2
function changeValue2($x){ $msg = “2倍した値:”; $y = $x * 2; return $msg . $y; } function display($x){ echo $x; } $x=100; $y = changeValue2($x); display($y);
例3
function changeValue3($x){ $msg = “変更後:”; $y = ($x + 10)/2; return $msg . $y; } function display($x){ echo $x; } $x=100; $y = changeValue3($x); display($y);
オブジェクト指向の有用性
この3つの例を見て、「なんか同じような処理を何度も書いていて面倒くさいな」と感じた方は、
オブジェクト指向的な考え方が向いているかもしれません。
3つを見比べると、以下の共通部分が抽出できます。
1.display関数で引数を表示している。
2.changeValueN関数で引数の値を何かしら変更を行い、戻り値を返している(N:1,2,3)。
3.$msgという変数に何かしら文字列をセットしている。
オブジェクト指向では、これらの共通部分(共通概念)を
大きな「class」という 「くくり」 にまとめます。
以下の例3では、共通処理をすべて一つのクラスにまとめています。
例3
abstract class Sample { private $msg; //←共通部分3 public abstract function changeValue($x); //←共通部分2 public function display($y){ //←共通部分1 echo $this->msg . $y; } } 共通処理を全てひとつのクラスにまとめることができました。 そして、さきほどの3つの処理は、この「Sample」クラスを元にして作成していきます。 以下changeValue1関数に代わる記述を追記し、実行してみましょう。
例3改造
abstract class Sample{ ~略~ } class Sample1 extends Sample{ private $msg = "変更後の値:"; public function changeValue($x){ $y = $x + 100; return $this->msg . $y; } } $s1 = new Sample1(); $y = $s1->changeValue(100); $s1->display($y);
「変更後の値:200」と表示されればOKです。これを参考に残り2つの処理も追記してみましょう。
例3再改造
abstract class Sample{ ~略~ } class Sample1 extends Sample{ ~略~ } $s1 = new Sample1(); $y = $s1->changeValue(100); $s1->display($y); class Sample2 extends Sample{ private $msg = "2倍した値:"; public function changeValue($x){ $y = $x * 2; return $this->msg . $y; } } $s2 = new Sample2(); $y = $s2->changeValue(100); $s2->display($y); class Sample3 extends Sample{ private $msg = “変更後:"; public function changeValue($x){ $y = ($x + 10) /2; return $this->msg . $y; } } $s3 = new Sample3(); $y = $s3->changeValue(100); $s3->display($y);
「2倍した値:200」「変更後:55」と表示されたでしょうか?
見慣れない記述がいくつもでてきたと思いますが、本節では気にしなくて構いません。
ただ、3つの処理を見比べてみると、何となく意味が見えてくる部分もあるはずです。じっくり見て下さい。
オブジェクト指向まとめ
では、ここまでのサンプルを元に、オブジェクト指向を理解するための基本的な用語を説明します。
(詳しくは順に説明していきます)
例4のように、重複する処理を一つの「クラス」という括りにまとめて定義することが、
オブジェクト指向の基本になります。
このときの右辺を「オブジェクト」や「インスタンス」、
「$s1」「$s2」「$s3」を「オブジェクト変数」「オブジェクト参照変数」といいます。
インスタンスの生成は、new クラス名();で行います。
例4
abstract class Sample class Sample1 extends Sample // 「インスタンス化」 $s1 = new Sample1(); $s2 = new Sample2(); $s3 = new Sample3();
オブジェクトには「メソッド」と「プロパティ」という「メンバ」を定義することができます。
メソッドはクラス内で定義されている関数のことで、プロパティはクラス内で定義されている変数のことです。
メソッドを操作、プロパティを属性とも言います。
2つをまとめてメンバといいます。
メソッドを呼び出すには、どのオブジェクトのメソッドかを指定する必要があります。
プロパティを使う際も同様に、どのオブジェクトのプロパティかを指定する必要があります。
指定する際には、アロー演算子と呼ばれる「->」を使います。
(なお、下記の「$this」は、自分自身を表す変数になります。)
例5
$y = $s1->changeValue(100); $s1->display($y); $y = $s2->changeValue(100); $s2->display($y); $y = $s3->changeValue(100); $s3->display($y);
$this->msg