オブジェクト指向の雰囲気をつかもう

#はじめに

この記事は[Gizumoエンジニア Advent Calendar 2015](http://www.adventar.org/calendars/919)の11日目の記事です。

今回は、オブジェクト指向について少し話したいと思います。

というのも、私がプログラミングを始めてからオブジェクト指向とは、に至るまでが果てしなく長かったので、私なりにアウトプットしようという思いに至りました。
オブジェクト指向ってなに？という疑問を少しでも解決しようかと思います。

ざっくりと進んでます。細かいことはあまり気にしてませんのであしからずm(_ _)m

#オブジェクト指向とは
>オブジェクト指向とは、ソフトウェアの設計や開発において、操作手順よりも操作対象に重点を置く考え方。
>関連するデータの集合と、それに対する手続き（メソッド）を「オブジェクト」と呼ばれる一つのまとまりとして管理し、その組み合わせによってソフトウェアを構築する。
>[IT用語辞典](http://e-words.jp/w/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91.html)より

はい。ふむふむと思った方は回れ右で問題無いと思います。

それでは、私なりのオブジェクト指向の雰囲気をさらっと書いていきます。

#クラス

**クラス** とは、色々なものを1つにまとめてくれる優れものです。設計図とも呼んだります。

なんのこっちゃということになるので、色々書きながら先に進みます。

まず、クラスの赤ちゃんを作りましょう。

```php:human.php
class human
{

}
```

これでクラスの赤ちゃんが出来ました。
ほとんど何も書いていないのであまり説明になってないですが、この中に色々と書いていきます。
最終的に、いろんなものをつめ込んでいき、ひとつのまとまりとしてクラスを仕上げていく感じです。

#インスタンス化

先ほど作成しましたクラスの赤ちゃんをこの世に誕生させる必要があります。
やはり、我が子をこの目で見たいですからね。

```php:human.php
class human
{

}

$human = new human();
```

`new　◯◯` を使うと、我が子が誕生します。そのまんまですね。
これを **インスタンス化** と呼びます。
我が子との初対面になるわけです。

#プロパティ

せっかくなので赤ちゃんに名前をつけてあげましょう。
そうですね。　ぎずもちゃん　にしましょうか。

```php:human.php
class human
{
    public $name;
}

$human = new human();
$human->name = "ぎずもちゃん";
```
クラスが持っている変数を **プロバティ** と呼びます。
この場合、$name が **プロパティ** になりますね。

##アクセス権
ここで、publicが登場しました。これは、アクセス権のお話になります。
PHPドキュメント「[アクセス権](http://php.net/manual/ja/language.oop5.visibility.php)」にガッツリ載ってます。
###public
**public** はどこからでもアクセス可能なことを意味します。
つまりこの場合、誰でも名前を変更出来るのです。怖いですね。

###private
**private**にすると、自分以外だれにも名前を変えさせることは出来ません。
なんて頼もしいやつなんだ。

###protected
**protected**は、クラス自身とそのクラスを継承したクラスからのみアクセスできます。
すなわち、関係者以外わたしにふれないでください、ということです。
今回この子は使わないのでスルーします。

##アロー演算子
急に「->」も出てきました。アロー演算子と呼ばれます。
◯◯の◯◯という意味合いになります。
ですので、今回の場合は【human】の【name】という意味合いになります。


#メソッド

しかし、このまま　ぎずもちゃん　の名前を誰にでも変更出来ちゃうのは困りますね。
public から private　にしましょう。

```php:human.php
class human
{
    private $name;
}

$human = new human();
$human->name = "ぎずもちゃん"; // エラー
```

よし、エラーになりましたね。このエラーをどうにかしなければ、この子が　ぎずもちゃん　と認識できません。

ここで、**メソッド** というものを作るとしましょう。
**メソッド** というのは、このクラスに入っている関数のことです。
ぎずもちゃん　という名前をつけてあげるべく作っていきますね。

```php:human.php
class human
{
    private $name;

    public function setName($newName)
    {
        $this->name = $newName;
    }
}

$human = new human();
$human->setName("ぎずもちゃん");
```

`setName`というメソッドを作成しました。
そして、プロパティにアクセスすると同様に、メソッドにアクセスするときも`->`です。
ですので、今回の場合は【human】の【setName】という意味合いになります。
このとき、メソッドへのアクセス権はpublicにしましょう。そうでなければメソッドへアクセスできません。
メソッドの引数につけてあげたい名前を入れてあげます。

あ、`this`　が出てきました。
この場合、`this`が指しているのは`class human`の`name`ということになります。

名前をちゃんと付けられたか確認をする為に、もう一つメソッドを作成します。

```php:human.php
class human
{
    private $name;

    public function setName($newName)
    {
        $this->name = $newName;
    }

    public function getName()
    {
        echo $this->name;
    }
}

$human = new human();
$human->setName("ぎずもちゃん");
$human->getName(); // ぎずもちゃん
```

この子の名前をゲットしてあげましょう。先ほどと同じような作りですね。
これで、この子の名前も付けれるようになり名前の確認も出来るようになりました。

え？赤ちゃんが生まれた瞬間に名前をつけてあげたいって？
仕方ないですね。


#__construct

便利なものがありました。`__construct`というものです。
こいつが何をしてくれるかというと。。。

```php:human.php
class human
{
    private $name;

    public function __construct($newName)
    {
        $this->setName($newName);
    }

    public function setName($newName)
    {
        $this->name = $newName;
    }

    public function getName()
    {
        echo $this->name;
    }
}

$human = new human("ぎずもちゃん");
$human->getName(); // ぎずもちゃん
```

赤ちゃんが生まれる時に、自動的に呼び出される便利なものです。
この場合、インスタンス化するものの引数に名前を入れると `__construct` に名前が渡され `setName` を実行しますよ、という流れになります。

しかし、弱りましたね。
違う命が誕生したとき、このクラスに色んなメソッドを書くのは気が引けますね。

例えば、バンドマンで二次元大好きで焼きそばヘッドの赤ちゃんが生まれるかもしれません。

```php:human.php
class human
{
    private $name;

    public function __construct($newName)
    {
        $this->setName($newName);
    }

　　〜略〜

    public function bandMen()
    {
        echo "バンドマンだよ";
    }

    public function nijigen()
    {
        echo "二次元って最高だよ";
    }

    public function yakisoba()
    {
        echo "焼きそばヘッドだよ";
    }
}

$human = new human("ぎずもちゃん");
$human->getName(); // ぎずもちゃん
```

こんな風に色んなメソッドを書いていくと、　ぎずもちゃん　に変な影響が及ぶ気がします。
ぎずもちゃん　は、バンドマンじゃないし二次元好きじゃないし焼きそばヘッドでもありません。
ぎずもちゃん　は、純粋無垢で真っ白なイメージでいて欲しいわけです。


#継承

ということで、バンドマンで二次元大好きで焼きそばヘッドの赤ちゃんの誕生の為に、ひと肌脱ぎましょう。

**継承** という便利なものがあります。
これは、コードの再利用ができたり、新たな機能を追加できたりするものです。

ちょっと見てみましょう。

```php:human.php
class nebeta extends human
{
    public function bandMen()
    {
        echo "バンドマンだよ";
    }

    public function nijigen()
    {
        echo "二次元って最高だよ";
    }

    public function yakisoba()
    {
        echo "焼きそばヘッドだよ";
    }

}
$nebeta = new nebeta("なべた");
$nebeta->getName();  // なべた
$nebeta->bandMen();  // バンドマンだよ
$nebeta->nijigen();  // 二次元って最高だよ
$nebeta->yakisoba(); // 焼きそばヘッドだよ
```

`class nebeta extends human`　という風に書きます。`human`を元に`nabeta`を新しく作成します、ということになります。

こうすることによって、`class human`で作った`setName`や`getName`が使えるのはもちろん、なべた特有の機能を追加することができます。

ぎずもちゃん　は　ぎずもちゃん　のままでいることができます。

実際、ぎずもちゃんの時にバンドマンやら二次元やら焼きそばヘッド使わなきゃいいじゃん、という話になるかもしれませんが、そういう訳にはいきません。
これは、凝集度や結合度の話に展開していきますがここでは割愛させていただきますm(_ _)m

要するに、**関係ないものをまとめないでくれ**、**他人を巻き込むな**、ということです。

もちろん、　なべた　のみならず、同じように継承した処理を書いていけば色んな命を生み出すことができます。

#まとめ

ざーっと書いちゃいました。
オブジェクト指向って結局なんなの？

個人的な見解でいえば、それぞれ **状態を保持する** ことが出来る便利なやつ、です。

どこかの記事でも見かけましたが、メソッドをまとめてホニャララしてるだけなら別にクラスにまとめる必要なんてないし~~いや、あるんだろうけど~~ただただ変数にまとめてポイってすればええやんになるわけです。

でも、今回は名前だけの処理だったり状態しか持ってないから簡単に見えますが、これがもっと大規模な開発になってくるととても大切になるんですよ。ほんとに。

たくさんの命が生まれ、【ここはどこ？私はだれ？】状態に陥ったら大変じゃないですか？
それぞれがきちんと自己管理できたら、それはそれは頼もしいんです。
親だったら子供には自立してほしいですよね。


#おわりに

ちょっと駆け足気味になりましたが、オブジェクト指向のちょこっとしたお話を終わります。
感覚的に書いたので、所々語弊を生むような気もするんですが、流れはこんな感じです。

現場によって書き方や考え方、規約などがあると思います。
もう、そこで慣れて経験して自分なりの考えを持って欲しいですね。はい。