😃

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