PHP オブジェクト指向をもっとわかりやすく学ぼう(インターフェース・抽象クラス・トレイト編)
インターフェースとは?
「インターフェース(interface)」とは、「接点」や「接続口」といった意味です。
- 💻 パソコンでいうと → キーボードやマウス
- 📱 スマホアプリでいうと → 画面のボタンや入力フォーム
- 💻 プログラムの中でいうと → 「この機能は必ずある」と決めておく約束事(ルール)
📘 インターフェースの使いどころ
- 「このクラスには絶対にこのメソッドがあるよ」とあらかじめ決めておく
- 処理内容(中身)は書かず、「名前と引数」だけを決めておく
- ソースコードを見なくても、使い方(仕様)が分かるようにする
✅ 実例で理解してみよう
記述内容を実際にWebサーバに出してみよう!
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php // 実行順:① interface InterfaceA { public const MOJI = "red"; // 定数(これは中身がある) // ②このメソッドが必ずある!というルール(中身は書かない) public function printA(); } // ③Color1クラスはInterfaceAを「implements(実装)」します class Color1 implements InterfaceA { // ④ここで printA の中身をちゃんと書く必要があります public function printA(){ print self::MOJI; // 定数を表示 } } // ⑤ インスタンスを作って $cr1 = new Color1(); // ⑥ メソッドを呼ぶと「red」が表示される $cr1->printA(); // → red ?> |
🧱 抽象クラスとは?
記述内容を実際にWebサーバに出してみよう!
| 比較項目 | インターフェース | 抽象クラス |
|---|---|---|
| メソッドの中身 | 書けない(宣言だけ) | 中身を書いてもOK |
| プロパティ | 書けない | 書ける(変数・関数OK) |
| 継承の仕方 | implements | extends |
抽象クラスを使った例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php // ① 抽象クラスの定義 abstract class Hoge { abstract public function t1(); // 必ずオーバーライドが必要 abstract protected function t2(); // 外から呼べない(protected) private $i_; // 普通のプロパティもOK } // ② Hogeを継承したクラスを作成 class Foo extends Hoge { public function t1() { echo "foo's t1()\n"; // ③呼ばれる $this->t2(); // ④ t2を内部から呼び出し } protected function t2() { echo "foo's t2()\n"; // ⑤表示される } } // ⑥ 実行 $obj = new Foo(); $obj->t1(); // → foo's t1() → foo's t2() ?> |
🧬 インターフェースの多重継承
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php interface Hoger { public function t1(); public function t2(); } interface Fooer { public function t2(); // 名前がかぶってもOK(意味が同じなら) public function t3(); } // 両方をimplementsしても大丈夫! class Bar implements Hoger, Fooer { public function t1() { echo "bar's t1() <br>"; } public function t2() { echo "bar's t2() <br>"; } public function t3() { echo "bar's t3() <br>"; } } $obj = new Bar(); $obj->t1(); $obj->t2(); $obj->t3(); ?> |
🧩 トレイト(trait)とは?
トレイトは「機能の部品」
PHPでは「多重継承ができない」ため、クラスの機能を部品として共有するために「トレイト(trait)」を使います。
- 共通メソッドをまとめたパーツ
- 必要なクラスで
useして取り込む - 継承と違って「自由に部品をくっつける」感じ!
トレイトを使ってみよう
記述内容を実際にWebサーバに出してみよう!
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php // ① トレイトの定義 trait Hoge { public function ho() { echo "function ho <br>"; } public $val_; } // ② クラスに組み込み class Foo { use Hoge; // ③ トレイトを取り込む } // ④ インスタンス作成 $obj = new Foo(); // ⑤ メソッド使用 $obj->ho(); // → function ho // ⑥ プロパティも使える $obj->val_ = 10; var_dump($obj); // Fooオブジェクトの中身確認 echo "<br>"; var_dump($obj->val_); // int(10) ?> |
課題
☕ 紅茶と珈琲を注ぐプログラムがあります
このコードに、「ミルクをセットする処理」を追加してみましょう!
ファイル名:techup.php
📝 ヒント
1.すべてのファイルをローカルにダウンロードして、まずは、実行し表示できるか確認してください。
2.実行時1箇所だけエラーになります。
3.index.phpにある「//※追加」箇所に追加してください。
4.require_onceが知りたい方は、先に「外部ファイルを読み込む」を参考にしてください。
完成したソースファイルをすべてGitHubにPushしてマージリクエストしてレビューをかけてください。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
<?php //クラスファイルを読み込む require_once 'Coffee.php'; require_once 'Tea.php'; require_once 'Dripper.php'; ?> <!DOCTYPE html> <html lang="ja"> <meta charset="utf-8"> <head> <title>喫茶マシーン</title> </head> <body> <?php //ドリッパーオブジェクトを生成する $dripper = new Dripper(); //コーヒーオブジェクトを生成する $coffee = new Coffee(); //紅茶オブジェクトを生成する //※追加 //ドリッパーにミルクを注ぐようにセットする print('ミルクを注ぐ機能:ON'); $dripper->setMilkStatus(true); //コーヒーを注いでみる print('コーヒーをセットして注ぎます。<br>'); print($dripper->dripDrink($coffee) . '<br>'); print('<br>'); //紅茶を注いでみる print('紅茶をセットして注ぎます。<br>'); print($dripper->dripDrink($tea) . '<br>'); print('<br>'); //ドリッパーにミルクを注がないようにセットする print('ミルクを注ぐ機能:OFF'); //※追加 //コーヒーを注いでみる print('コーヒーをセットして注ぎます。<br>'); //※追加 print('<br>'); //紅茶を注いでみる print('紅茶をセットして注ぎます。<br>'); //※追加 print('<br>'); ?> </body> </html> |
インターフェースを使って「飲み物に共通する処理」を決めよう
クラスごとに中身を変えて実装
ミルクを加える処理は、addMilk()などのメソッドを新しく作ってもOK!
出力は「紅茶にミルクを入れました」「珈琲にミルクを入れました」のように!
実行結果

課題・復習用検索キーワード
| 検索例 |
| 🔍php インターフェース |
| 🔍php echo printf 違い |
| 🔍php require_onceとは |