オブジェクト指向とクラス

今回はこれまでの学習の振り返りと定着も兼ねて、オブジェクト指向とクラスの概念について簡単ですがまとめてみました。
私も含め、オブジェクトは多くの初学者が挫折するポイントだと思うので、この記事が少しでも役に立てば幸いです。

##オブジェクトとは

オブジェクトとは、処理や定義をまとめた塊の事です。
この時、オブジェクト内の変数をプロパティ、関数をメソッドと呼びます。
例えば、下記のようにする事で配列もオブジェクトにする事ができます。

```php:
<?php
$object = (object)[
       'a' => 100,
       'b' => 100,
       'c' => 100,
]
```


これは、配列をオブジェクト型でキャストする事で強制的にオブジェクトを作成しています。

###オブジェクトの中を参照する

オブジェクトの中にあるメソッドやプロパティを利用する場合は、アロー演算子（->）と呼ばれる演算子を使います。
配列で作っていますが、キーの参照はできないので注意して下さい。

```php:
<?php
$object = (object)[
       'a' => 100,
       'b' => 200,
       'c' => 300,
];
echo $object->a;
```
##クラスとは
クラスとはオブジェクトの設計図にあたります。
クラスを宣言することによって、その設計構造を持ったオブジェクトを作る事が可能となります。このオブジェクトの事をクラスオブジェクトといいます。

それでは、下記を参考にTestクラスを作成してみましょう。


```php:test.php
<?php
class Test {
      private $old = 0;
      protected $name = '';
      public $force_name = '斎藤';

      public function hello($name, $old)
      {
            $this->name = $name;
            $msg = '私の名前は,' .$name . 'です。';

            if($old > 0) {
                 $msg = $old . '歳です。';
            }
            return $msg;
      }
}
```


このPHPを実行しても何も表示されません。
前述したように、クラスでは設計図を作成しただけの状態です。

###クラスをインスタンス化する
クラスからオブジェクを新たに作成する事をインスタンス化と言い、インスタンス化されたものをインスタンスと呼びます。
Test.phpを作った同じフォルダに下記のファイルを作成してみましょう。


```php:index.php
<?php
require_once('./Test.php');

$test = new Test();
$test->hello('太郎', 10);
```



index.phpの作成が完了したら、ブラウザからアクセスしてみましょう。
おそらく下記のような実行結果が得られると思います。

```私の名前は太郎です。 10歳です。```

このようにクラスをインスタンス化し、インスタンス化された変数を使って処理を行うのが一般的な使い方です。

また、クラスをインスタンス化する場合、そのクラスを宣言している処理が記述してある必要があります。上記の例では下記のようにしてTest.phpを読み込ませて処理済みのように見せかけています。

```
<?php
require_once('./Test.php');
```

###クラスの継承
クラスには「継承」という概念が存在します。
継承を行ったクラスでは、継承元のクラスの機能を**コンストラクタ以外**の全て持つ事が出来るよになります。
それではTest.phpをBase.phpに変更し、Test.phpというファイルを作成してください。

```php:test.php
<?php
require_once('./Base.php');

class Test exteds Base {
}
```

```php:Base.php
<?php
class Base {
      private $old = 0;
      protected $name = '';
      public $force_name = '斎藤';

      public function hello($name, $old)
      {
             $this->name = $name;
             $msg = '私の名前は、' .$name . 'です。';

             if($old > 0) {
                  $msg = $old . '歳です';
             }
             return $msg;
      }
}
```

作成できたら、ブラウザからindex.phpにアクセスしてみましょう。
Test.phpにはhello関数がないにもかかわらず、先ほどと同じ表示になります。
これはつまり、TestクラスがBaseクラスの機能を継承したという事になります。

##アクセス修飾子
継承の理解に併せて、アクセス修飾子も抑えておきましょう。
クラス内でプロパティやメソッドを宣言する時、public、private、protectedという宣言をする必要があります。

これは、変数や関数へのスコープの制限を行っています。

・**public**・・・クラスでもインスタンスでも参照できる
・**private**・・・自分のクラス内からしか参照できない
・**protected**・・・継承元のクラスまでが参照できる

クラス内で定義したプロパティやメソッドをクラウ内で利用する場合、**$this->**を先頭に付ける必要があります。これは**「自分自身のクラス内」**という意味を持ちます。
こうする事で、自身のプロパティを書き換えたり、メソッドを参照する事ができる様になります。
これは継承元のプロパティやメソッドでも同様に呼び出しができます。

実際に動きを確認してみます。

```php:Base.php
class Base {
      private $old = 10;
      protected = $name = '太郎';
      public $force_name = '山田';

      public function get_old() {
             return $this->old;
     }

     public function get_name() {
            return $this->name;
     }

     public function get_force_name() {
            return $this->force_name;
     }

```

```php:Test.php
require_once('./Base.php');
class Test exteds Base {
      public function get_old() {
             return $this->old;
      }

      public function get_name() {
             return $this->name;
      }

      public function get_force_name() {
             return $this->force_name;
      }
}
```

```php:index.php
require_once('./Test.php');
$test = new Test;

echo $test->get_old();
echo $test->get_name();
echo $test->get_force_name();
```
ここでは一例を書きましたが、プロパティだけではなくメソッドにも適用する事ができます。
プロパティやメソッドの制約を書き換えて動きを確認すると理解が一層深まると思います。


##さいごに
いかがだったでしょうか。
簡単ですが、オブジェクトとクラスとアクセス修飾子についてでした。
オブジェクト指向はPHPだけでなく、あらゆる言語で用いられ避けては通れない概念ですので,
理解を深めたいものです。
冒頭でもお伝えしましたが、この記事を読んで少しでも理解のきっかけになれば幸いです。
今後も皆様の役に立つ情報を発信出来たらと思いますのでよろしくお願い致します。