オブジェクト指向プログラミングの簡単なイメージ

　クラスとインスタンスの違いも分からずに、Javaの文字列の比較さえ働かせずに無力感が続いた日々も懐かしいものです。
自己流の扇風機オブジェクトを設計し、PHPで動作させ、思惑通りに働いたとき、オブジェクト指向プログラミングの基本が分かった気がしたのでした。
　現実としては、自作のクラスを操ることは少なくて、グラフモジュールやCSSなどを指定しては操作することが多いのですが、基本の理解がドキュメントの理解やエラー修正などに役立っていると思います。
　自分が独学でオブジェクト指向を理解するのに苦労したことを思い浮かべて、初心者が無理なくオブジェクト指向プログラムの基本をイメージ化するために以下の図を作りました。
##オブジェクト指向プログラミングの簡単なイメージ
![オブジェクト指向プログラミングの簡単なイメージ](https://qiita-image-store.s3.amazonaws.com/0/147091/3afc0992-bd58-f53a-9258-f4692624ac6d.jpeg)

　オブジェクトを操作するということは、コンピュータのメモリー上に設置されたインスタンスに対して指示を出すことです。
　この図のように設計図が**クラス**で、個々の住宅が**インスタンス**です。**インスタンス化**とは、メモリー上にオブジェクトの区画を確保することです。このインスタンスごとに各機能を働かせる訳です。

例.　`住宅1 = new 設計住宅`　(インスタンス化)
　　`住宅1.風呂に入る`  　　(メソッド操作)
　　`住宅1.料理を作る`  　　(メソッド操作)
 　 　  `住宅1.住人数`　　　  (プロパティ呼出)
 　 　`住宅1.築年数`　　　  (プロパティ呼出)

　そして、クラスであらかじめ屋根の形などの変更オプションを用意しておくのが**多態性**で、設計住宅を元にスマート住宅や介護使用住宅に改造していくのが**継承**で、個々の住宅ごとで各部屋が独立しており、別々に操れることが**カプセル化**ということです。
　異論もあると思いますが、図と言葉のみで簡単にオブジェクト指向をイメージ化するのには有効ではないかと考えます。

＜　補　足　＞
　　　　[扇風機オブジェクトの操作デモ](http://seastar.la.coocan.jp/senpuuki_obj/senpuuki_sousa1.php)
初期にPHPで作った扇風機オブジェクト

```php:senpuuki_class1.php
<?php
class senpuuki_class{
    var $namae;
    var $onoff;
    var $dankai;
    var $kubionoff;

// 扇風機クラスの実体（インスタンス）
    function senpuuki_class($meisyou){
            $this->namae = $meisyou;
            $this->onoff = False;
            $this->dankai = 0;
            $this->kubionoff = False;
    }

// 扇風機の電源オン
    function push_sw($sw){
        if ($sw="on") {
            $this->onoff = True;
            $this->dankai = 1;
        } else {
            $this->onoff = False;
        }
    }

// 扇風機の風速調節
    function change_tsuyosa($tsuyosa){
        if ($tsuyosa >= 1 & $tsuyosa <= 3) {
            $this->dankai=(int)$tsuyosa;
        } else {
            $this->dankai=1;
            print("<br>指定した強さが違います。<br>");
        }
    }

// 扇風機の首振り切り替え
    function change_kubionoff($kubisw){
        if ($kubisw="on") {
            $this->kubionoff = True;
        } else {
            $this->kubionoff = False;
        }
    }

// 扇風機の動作回答
    function check_dousa(){
        print("名称は、 " . $this->namae . "です。<br/>");
        print("電源は、 " . $this->onoff . "です。<br/>");
        print("風速は、 " . $this->dankai . "です。<br/>");
        print("首振は、 ");
        if ($this->kubionoff) {print("作動中");} else {print("停止中");}
        print("です。<br/>");
    }

// 扇風機の風速回答
    function anser_dankai(){
        print($this->namae . "の風速は、 " . $this->dankai . "です。<br/>");
        if ($this->kubionoff) {
            switch ($this->dankai){
              case 1 :
                print("　　　ブ～ン<br/>");
                break;
              case 2 :
                print("　　ブ～ン　ブ～ン<br/>");
                break;
              case 3 :
                print("ブ～ン　ブ～ン　ブ～ン<br/>");
                break;
              default:
                print("故障かな？<br/>");
                break;
            }
        } else {
            switch ($this->dankai){
              case 1 :
                print("　　　ブーン<br/>");
                break;
              case 2 :
                print("　　ブーン　ブーン<br/>");
                break;
              case 3 :
                print("　ブーン　ブーン　ブーン<br/>");
                break;
              default:
                print("故障かな？<br/>");
                break;
            }
        }
    }
}
?>
```
その扇風機を操作するPHPプログラム

```php:senpuuki_sousa1.php
<?php
require_once( "senpuuki_class1.php" );
// 扇風機オブジェクトを継承し操る　senpuuki_sousa2.php

class senpuuki_class_2 extends senpuuki_class {
// ３段階化だった扇風機の風速調節を５段階化する
    function change_tsuyosa($tsuyosa){
        if ($tsuyosa >= 1 & $tsuyosa <= 5) {
            $this->dankai=(int)$tsuyosa;
        } else {
            $this->dankai=1;
            print("<br>指定した強さが違います。<br>");
        }
    }
// 扇風機の風速回答
    function anser_dankai(){
        print($this->namae . "の風速は、 " . $this->dankai . "です。<br/>");
        if ($this->kubionoff) {
            switch ($this->dankai){
              case 1 :
                print("　　　ブ～ン<br/>");
                break;
              case 2 :
                print("　　ブ～ン　ブ～ン<br/>");
                break;
              case 3 :
                print("ブ～ン　ブ～ン　ブ～ン<br/>");
                break;
              case 4:
                print("ブ～ン　ブ～ン　ブ～ン　ブ～ン<br/>");
                break;
              case 5 :
                print("ブ～ン　ブ～ン　ブ～ン　ブ～ン　ブ～ン<br/>");
                break;
              default:
                print("故障かな？<br/>");
                break;
            }
        } else {
            switch ($this->dankai){
              case 1 :
                print("　　　ブーン<br/>");
                break;
              case 2 :
                print("　　ブーン　ブーン<br/>");
                break;
              case 3 :
                print("　ブーン　ブーン　ブーン<br/>");
                break;
              case 4:
                print("ブーン　ブーン　ブーン　ブーン<br/>");
                break;
              case 5 :
                print("ブーン　ブーン　ブーン　ブーン　ブーン<br/>");
                break;
              default:
                print("故障かな？<br/>");
                break;
            }
        }
    }
}

print("<br/>扇風機オブジェクトを元に、風速５段階に改造した扇風機オブジェクト２を設定する。<br/><br/>");

// 扇風機 涼風を実体化
print("扇風機 涼風を実体化<br/><br/>");
$suzukaze = new senpuuki_class("涼風");

// 扇風機 パワーファンを実体化
print("改造型扇風機 パワーファンを実体化<br/><br/>");
$powerfan = new senpuuki_class_2("パワーファン");

// 涼風をスイッチオン
print("扇風機 涼風をスイッチオン<br/><br/>");
$suzukaze->push_sw("on");

// 涼風を動作チェック
print("扇風機 涼風の動作確認<br/><br/>");
$suzukaze->check_dousa();

// パワーファンをスイッチオン
print("扇風機 パワーファンをスイッチオン<br/><br/>");
$powerfan->push_sw("on");

// パワーファンを動作チェック
print("扇風機 パワーファンの動作確認<br/><br/>");
$powerfan->check_dousa();

// 涼風を首振りする
print("扇風機 涼風を首振りに切り替える<br/><br/>");
$suzukaze->change_kubionoff("on");

// 涼風を動作チェック
print("扇風機 涼風の動作確認<br/><br/>");
$suzukaze->check_dousa();

// 涼風の風速チェック
print("扇風機 涼風の風速表示<br/><br/>");
$suzukaze->anser_dankai();

// 涼風を風速５にする（エラー表示が出て、風速１になる）
print("扇風機 涼風を風速５にする（エラー表示が出て、風速１になる）<br/><br/>");
$suzukaze->change_tsuyosa(5);

// 涼風の風速チェック
print("扇風機 涼風の風速表示<br/><br/>");
$suzukaze->anser_dankai();

// パワーファンを風速５にする（パワーファンは、改造型の扇風機なのでエラーにならない。）
print("扇風機 パワーファンをを風速５にする（パワーファンは、改造型の扇風機なのでエラーにならない。）<br/><br/>");
$powerfan->change_tsuyosa(5);

// パワーファンを動作チェック
print("扇風機 パワーファンの動作確認<br/><br/>");
$powerfan->check_dousa();

// パワーファンの風速チェック
print("扇風機 パワーファンの風速表示<br/><br/>");
$powerfan->anser_dankai();

?>
```

以上です。