インターフェイス (interface)
テクノロジ系 / class-advanced (継承 / オーバーライド / abstract / interface / static / const / final)
インターフェイス (interface)
Lesson 9 / Chapter 5
「中身」を持たない「契約」だけのクラス
<?php
interface Printable {
public function output(): void;
}interfaceは メソッドの一覧 だけ- 中身
{ ... }も、プロパティも書かない - 「このメソッドを必ず持っている」という 約束 を定義する
implements で契約を守ると宣言
<?php
class Book implements Printable {
public string $title;
public function output(): void {
echo "本のタイトル: {$this->title}\n";
}
}implements インターフェイス名で「この契約を守る」と宣言- 契約 (
output) を実装しないと Fatal error - 子は親契約を満たす義務がある
使い方は普通のメソッド呼び出し
<?php $b = new Book(); $b->title = "PHP 入門"; $b->output();
実行結果:
本のタイトル: PHP 入門
- 使う側は「インターフェイスを実装してる」ことしか知らなくて良い
- 中身がどう書かれているかは気にしない
abstract class とどう違う?
| abstract class | interface | |
|---|---|---|
| インスタンス化 | できない | できない |
| プロパティ | 持てる | 持てない (定数は OK) |
| メソッドの中身 | 書ける | 書けない |
| 継承・実装の数 | 1 つだけ | 複数 OK |
1 つのクラスで複数のインターフェイスを実装
<?php
interface Printable { public function output(): void; }
interface Sellable { public function price(): int; }
class Book implements Printable, Sellable {
public string $title;
public function output(): void { echo "{$this->title}\n"; }
public function price(): int { return 1500; }
}- カンマで並べる
- 「印刷可能」かつ「販売可能」の両方の契約を満たす
このチャプターでできるようになること
✅ interface でメソッドの契約を定義できる
✅ implements で契約を守ると宣言できる
✅ 1 クラスで複数のインターフェイスを実装できる
✅ abstract class との使い分けを言える
→ ドリルへ
考えてみよう
既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。
ドリル 01 — Printable を Book で実装する
問題
Printable インターフェイスを定義してください。
- メソッド宣言:
public function output(): void;(中身は書かない)
Printable を実装する Book クラスを定義してください。
- プロパティ
title(string) output()は"本のタイトル: {title}"を 1 行出力する
Book のインスタンスを作って title に "PHP 入門" を入れ、output() を呼んでください。
期待される出力:
本のタイトル: PHP 入門
採点
php scripts/grade.php topics/class-advanced/ch05-interface/drill/01-implements/
ヒント
interface Printable { public function output(): void; }class Book implements Printable { ... }output()の中身はclass側で書く