😃
PHPで学ぶオブジェクト指向プログラミングの基本
##1. クラスとオブジェクト:設計図と実物
- クラス: 「設計図」です。例えば「車」クラスは、すべての車が持つべき特徴(色、メーカー)やできること(走る、止まる)を定義します。これだけでは実体はありません。
 - オブジェクト(インスタンス): 設計図に基づいて作られた「実物」です。「トヨタのプリウス」「ホンダのN-BOX」のように、具体的な車のことです。new クラス名() で作成します。
 
<?php
class Product
{
    // 変数(プロパティ):商品の情報
    private $name; // 商品名
    private $price; // 価格
    // 関数(メソッド):商品ができること
    // コンストラクタ:オブジェクト作成時に自動で実行される初期設定
    public function __construct($name, $price)
    {
        $this->name = $name; // オブジェクト自身の名前を設定
        $this->price = $price; // オブジェクト自身の価格を設定
    }
    // 商品名を取得するメソッド
    public function getName()
    {
        return $this->name;
    }
    // 価格を取得するメソッド
    public function getPrice()
    {
        return $this->price;
    }
}
// オブジェクトの作成(インスタンス化)
$apple = new Product('りんご', 150);
$orange = new Product('みかん', 100);
echo "商品名: " . $apple->getName() . ", 価格: " . $apple->getPrice() . "円\n";
echo "商品名: " . $orange->getName() . ", 価格: " . $orange->getPrice() . "円\n";
?>
##2. 抽象クラス(Abstract Class)と抽象メソッド(Abstract Method):未完成の設計図
- **「不完全な設計図」**です。
 - abstract キーワードで定義し、自身を直接オブジェクトにすることはできません。
 - 抽象メソッド(abstract public function メソッド名();)を持つことができます。これは「このメソッドは子クラスで必ず実装しなさい」という義務付けで、具体的な処理は書きません。
 - 通常のメソッド(実装済みのメソッド)も持てます。
 - 使い分け: 「〇〇は△△の一種である」という、共通の基盤を持ちつつ一部未完成なグループに使います。
 
##3.インターフェース(interface):能力の企画書・契約書
- **「能力の企画書」や「契約書」**のようなものです。
 - interface キーワードで定義し、メソッドの定義(名前、引数、戻り値)だけを記述し、具体的な処理は一切書きません。
 - 自身を直接オブジェクトにすることはできません。
 - インターフェースを実装(implements)したクラスは、定義された全てのメソッドを必ず実装しなければなりません。
 - 使い分け: 「〇〇は△△の能力を持つ」という振る舞いを表現したい場合に使います。
 - PHPでは、1つのクラスが複数のインターフェースを同時に実装できます。
 
| 特徴 | 抽象クラス (Abstract Class) | インターフェース (Interface) | 
|---|---|---|
| 例え | 未完成の設計図 | 企画書、契約書、資格試験の要項 | 
| 目的 | 共通の基盤(実装済みメソッド)を提供しつつ、特定の部分(抽象メソッド)の実装を子クラスに強制する | 特定の「振る舞い」や「能力」を定義し、それを実装するクラスにその振る舞いを約束させる | 
| 実装有無 | メソッドの実装も記述できるが、抽象メソッドは実装しない。 | メソッドの定義(名前、引数、戻り値)のみ。実装は書かない。 | 
| 継承/実装 | extends で1つだけ継承できる | implements で複数実装できる | 
| 考え方 | 「〇〇は△△の仲間だ。共通部分はあるが、この部分は具体的に作ってね。」 | 「〇〇は△△の能力を持つ。この能力を使うなら、この機能は全部作ってね。」 | 
Discussion