Developer

【PHP応用】 オブジェクト指向とは
2021.03.31
Lv1

【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

関連記事

1. オブジェクト指向とは何か。その秀逸な例えのまとめ