採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

インターフェイス (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 classinterface
インスタンス化できないできない
プロパティ持てる持てない (定数は 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 側で書く