言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

PHP辞典

  1. トップページ
  2. PHP辞典
  3. extends / implements / abstract / interface

extends / implements / abstract / interface

対応: PHP 5(2004)

クラスの継承、インターフェースの実装、抽象クラスの定義を行うための構文です。コードの再利用性と拡張性を高めます。

構文

// 親クラスを継承します
class 子クラス extends 親クラス { }

// インターフェースを定義します
interface インターフェース名 {
	public function method(): void;
}

// インターフェースを実装します
class クラス名 implements インターフェース名 { }

// 抽象クラスを定義します
abstract class 抽象クラス名 {
	abstract public function method(): void;
}

構文一覧

構文概要
extends親クラスを継承して子クラスを定義します。PHPの継承は単一継承のみで、1つのクラスしか継承できません。
implementsインターフェースを実装します。カンマ区切りで複数のインターフェースを同時に実装できます。
interfaceメソッドの仕様だけを定義する型です。実装は含まず、クラスが必ず実装すべきメソッドを規定します。
abstract抽象クラスや抽象メソッドを定義します。抽象クラスはインスタンス化できず、子クラスで抽象メソッドを実装する必要があります。
parent::親クラスのメソッドやコンストラクターを呼び出す際に使用します。メソッドのオーバーライド時に親の処理も実行したい場合に使います。

サンプルコード

sample_extends.php
<?php
// 基本的な継承の例
class Fighter {
	public function __construct(
		protected string $name
	) {}

	public function battle(): string {
		return "{$this->name}が身構えている。";
	}
}

class KofFighter extends Fighter {
	public function battle(): string {
		return "{$this->name}が動き出した!"; // メソッドをオーバーライドします
	}

	public function special(): string {
		return "{$this->name}の鬼焼き!";
	}
}

$fighter = new KofFighter("八神庵");
echo $fighter->battle(); // 『八神庵が動き出した!』と出力されます。
echo $fighter->special(); // 子クラス独自のメソッドも使えます。

// parent:: で親のコンストラクターを呼び出す例
class User {
	public function __construct(
		protected string $name,
		protected int $age
	) {}
}

class Admin extends User {
	public function __construct(
		string $name,
		int $age,
		private string $role
	) {
		parent::__construct($name, $age); // 親のコンストラクターを実行します
	}
}

// インターフェースの定義と実装
interface Loggable {
	public function to_log(): string;
}

interface Cacheable {
	public function cache_key(): string;
}

// 複数のインターフェースを同時に実装できます
class Article implements Loggable, Cacheable {
	public function __construct(
		private int $id,
		private string $title
	) {}

	public function to_log(): string {
		return "[Article:{$this->id}] {$this->title}";
	}

	public function cache_key(): string {
		return "article_{$this->id}";
	}
}

$article = new Article(1, "PHPの基本");
echo $article->to_log();    // 『[Article:1] PHPの基本』と出力されます。
echo $article->cache_key(); // 『article_1』と出力されます。

// 抽象クラスの例
abstract class Shape {
	abstract public function area(): float;

	public function describe(): string {
		return "面積は " . $this->area() . " です。"; // 抽象メソッドを呼び出せます。
	}
}

class Circle extends Shape {
	public function __construct(
		private float $radius
	) {}

	public function area(): float {
		return pi() * $this->radius ** 2; // 抽象メソッドを実装します
	}
}

class Rectangle extends Shape {
	public function __construct(
		private float $width,
		private float $height
	) {}

	public function area(): float {
		return $this->width * $this->height;
	}
}

$circle = new Circle(5);
echo $circle->describe(); // 『面積は 78.539816339745 です。』と出力されます。

$rect = new Rectangle(4, 6);
echo $rect->area(); // 『24』と出力されます。
php sample_extends.php
八神庵が動き出した!八神庵の鬼焼き![Article:1] PHPの基本article_1面積は 78.539816339745 です。24

概要

『extends』による継承は、既存のクラスの機能を引き継ぎつつ新しい機能を追加・変更するための仕組みです。PHPの継承は単一継承のみで、1つのクラスは1つの親クラスしか持てません。複数のクラスの機能を組み合わせたい場合は、インターフェースや『trait』を使用してください。

インターフェースは「このメソッドを必ず実装してください」という契約を定義するものです。クラスの実装に依存せずにメソッドの存在を保証できるため、大規模なプログラムでの型安全性の向上に役立ちます。抽象クラスはインターフェースと具象クラスの中間的な存在で、一部のメソッドだけ実装を強制し、共通の処理は親クラスにまとめることができます。

クラスの基本については『class』、アクセス修飾子については『public / private / protected』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。