【PHP】抽象クラス・具象クラス・インターフェース・traitを簡単に紹介します

今日は、PHPのオブジェクト指向について紹介します。

正直僕もわかっていませんが、アウトプットすることによって少し理解が深まると思っての投稿です。

理解が間違ってたら教えてください。

versions
  • PHP 8.0.0

オブジェクト指向とは何かを知ろう

結論
  • カプセル化
  • 継承
  • ポリモーフィズム

上記の概念で成り立っているのが、オブジェクト指向と呼ばれています。

カプセル化とは何か

classと表現されることが多く、外からの影響を受けないことを指しています。

ある1つのもの(オブジェクト)として独立させることで、保守性を担保します。

継承とは何か

スーパークラスとサブクラスと表現されることが多く、親子関係を作ることを指しています。

親と子の関係を成立させることで、共通項を子に引き継ぐことができます。

ポリモーフィズムとは何か

もの(オブジェクト)がもの(オブジェクト)らしく振る舞えることを指しています。

なんだかわかりませんね。。。

端的に、抽象化するということでしょうか(僕なりの解釈です)

例えば、Aさんが歩く、Bさんが歩くというメソッドを作ります。

共通項は、「歩く」ですね。

それを、切り出して、「人間」クラスというオブジェクトを作って、ひとまとめにすることで、オブジェクトらしく振舞うことができます。

これが、ポリモーフィズムです。

これってあってますかね??

とりあえず難しいので、いったんコーディングしていきます。

具象クラスをコーディングしよう

<?php
class Asan{
    public function walk() {
        echo '歩く';
    }
}

$asan = new Asan;
$asan->walk();
?>

これがオブジェクト指向の第一歩ですね。

Aさんというクラスを作成することで、Aさんが行うことを独立させることができました。(カプセル化)

抽象クラスをコーディングしよう

<?php
abstract class Human{
    public function walk() {
        echo '歩く';
    }
}
class Asan extends Human{
}

$asan = new Asan;
$asan->walk();
?>

extendsメソッドを使用して、抽象クラスを継承することで、walkというメソッドが使用できます。

インターフェースをコーディングしよう

抽象クラスとの比較で解説されますが、抽象クラスはあくまでもクラスなので、メソッド内の実行処理も定義できます。

それと比較してインターフェースは、メソッドのみを定義して、具体的な処理は具象クラスに定義します。

<?php
interface EatingInterface{
    public function eat();
}

class Asan implements EatingInterface{
    public function eat() {
        echo '菜食主義です';
    }
}

class Bsan implements EatingInterface{
    public function eat() {
        echo '肉食主義です';
    }
}

$asan = new Asan;
$bsan = new Bsan;

$asan->eat();
$bsan->eat();
?>

implementsメソッドを使用することで、継承の関係を作ります。

また、インターフェースの特徴は、「多重継承」を成立させることができます。

そのため、多様なメソッドの定義を強制できることがメリットです。

traitをコーディングしよう

最後にtraitです。

traitは、単体でメソッドを定義できます。

そのため、継承までは必要ないが、単体でメソッドを切り出したいいくつかのオブジェクトの中でメソッドの処理を実行したい、という時に便利です。

<?php
trait SportsTrait{
    public function soccer() {
        echo 'サッカーをします';
    }
}

class Asan extends Human implements EatingInterface{
    use SportsTrait;
}
$asan = new Asan;
$asan->soccer();
?>

メソッドの処理までを単体で切り出せるのは便利ですね。

まとめ

  • オブジェクト指向は、カプセル化、継承、ポリモーフィズムの概念が特徴
  • 抽象クラス、インターフェースはメソッドの定義を強制する
  • 抽象クラスは単一継承
  • インターフェースは多重継承
  • traitはメソッドの処理を切り出せる

参考

カプセル化とはなにか?超わかりやすく解説します!

オブジェクト指向「継承」とは?わかりやすく解説してみた

ポリモーフィズムとはなにか?超わかりやすく解説します!

【詳解】抽象クラスとインタフェースを使いこなそう!!

PHPにおけるインターフェースと抽象クラス、多重継承、トレイトの使い方 (1/2)