😃
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