PHP インターフェースの検証

インターフェースとはなんなのか、何も知らないところからスタートします。
公式ドキュメントから引用。
```
オブジェクトインターフェイスにより、あるクラスが実装する必要があるメソッドの種類を、
これらのメソッドの実装を定義することなく、指定するコードを作成できるようになります。
```

では、実際に書いていきます。


<h1>1.基本</h1>
理解するのに時間がかかりました。

```test_sample.php
<?php

require_once(__DIR__ . '/classTest.php');

classSample::two();

?>
```

```classTest.php
<?php

interface Test {
    public function one();
    public function two();
}

class classTest implements Test
{
    public function one(){
        echo 'TestOne';
        
    }

    public function two(){
        echo 'TestTwo';

    }

}

class classSample implements Test
{
    public function one(){
        echo 'SampleTwo';

    }

    public function two(){
        echo 'SampleTwo';

    }
}

?>
```

```
・実行結果
SampleTwo
```

ここまでは普通なんですけど、
インターフェースで指定したメソッドは最低限使わなくちゃいけないやつです。

上記ならoneメソッドとtwoメソッドは最低限使わなきゃいけない。

では、classSampleのoneメソッドをコメントアウトして実行したら以下↓

```
・実行結果
Fatal error: Class classSample contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Test::one) in /・・・・・・/classTest.php on line 22
```

<h1>2.メソッドが増えた場合</h1>
メソッドが増える文には問題ないかな？

```test_sample.php
<?php

require_once(__DIR__ . '/classTest.php');

classSample::three();

?>
```

```classTest.php
<?php

interface Test {
    public function one();
    public function two();
}

class classTest implements Test
{
    public function one(){
        echo 'TestOne';
        
    }

    public function two(){
        echo 'TestTwo';

    }

}

class classSample implements Test
{
    public function one(){
        echo 'SampleOne';

    }

    public function two(){
        echo 'SampleTwo';

    }

    
    public function three(){
        echo 'SampleThree';

    }

}

?>
```

```
・実行結果
SampleThree
```

増えたメソッドに関しては使える。

<h1>3.継承</h1>
継承はできるか・・・・・・

```classTest.php
<?php

interface Test extends classTest {
    public function one();
    public function two();
}

class classTest
{
    public function one(){
        echo 'TestOne';
        
    }

    public function two(){
        echo 'TestTwo';

    }

}

class classSample implements Test
{
    public function one(){
        echo 'SampleOne';

    }

    public function two(){
        echo 'SampleTwo';

    }

}

?>
```

```
・実行結果
Fatal error: Test cannot implement classTest - it is not an interface in /・・・・・・・/classTest.php on line 3
```

これなら？

```classTest.php
<?php

interface TestA {
    public function one();
}

interface TestB extends TestA{
    public function two();
}

class classTest
{
    public function one(){
        echo 'TestOne';
        
    }

    public function two(){
        echo 'TestTwo';

    }

}

class classSample implements TestA
{
    public function one(){
        echo 'SampleOne';

    }

    public function two(){
        echo 'SampleTwo';

    }

}

?>
```

```
・実行結果
SampleTwo
```

なるほど。
インターフェースとなら継承可能ですね。

ちな、カンマ区切りで複数継承可能。

```classTest.php
<?php

interface TestA {
    public function one();
}

interface TestB{
    public function two();
}

interface TestC extends TestA, TestB{
    public function three();
}

class classSample implements TestC
{
    public function one(){
        echo 'SampleOne';

    }

    public function two(){
        echo 'SampleTwo';

    }

    public function three(){
        echo 'SampleThree';

    }

}

?>
```


<h1>4.interfaceとabstractの違い</h1>

 下記の記事↓
https://qiita.com/yukiyohure0923/items/0e49a313b2b8c98d3a29
引用させて頂きます。


・interface
1.定数を定義できる
2.アクセス修飾子はpublicのみ指定可能
3.interfaceはクラスじゃないからインスタンス化できない
4.クラスで使うときはimplementsでinterface名を指定する
5.実装を伴うメソッドやプロパティの定義はできない(抽象メソッドのみ)
6.１つのクラスに対し複数のinterfaceを実装できる(多重継承みたいなことができる)
7.interfaceで定義したメソッドをクラス内で必ず使用(オーバーライド)しなければならない

・abstract
1.アクセス修飾子は自由につけられる
2.抽象プロパティだけ抽象クラスの中で定義できない
3.抽象クラスはクラスだけど直接インスタンス化できない
4.クラスで使うときは普通の継承のようにextendsを使う
5.普通のクラスみたいに中身があるメソッドやプロパティを定義できる
6.抽象クラスで「定義し、なおかつ未実装のメソッド」を継承したクラス内で必ず使用(オーバーライド)しなければならない