Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
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::親クラスのメソッドやコンストラクターを呼び出す際に使用します。メソッドのオーバーライド時に親の処理も実行したい場合に使います。
サンプルコード
<?php
// 基本的な継承の例です。
class Animal {
	public function __construct(
		protected string $name
	) {}

	public function speak(): string {
		return "{$this->name}が鳴いています。";
	}
}

class Dog extends Animal {
	public function speak(): string {
		return "{$this->name}: ワンワン!"; // メソッドをオーバーライドします。
	}

	public function fetch(): string {
		return "{$this->name}がボールを取ってきました。";
	}
}

$dog = new Dog("ポチ");
echo $dog->speak(); // 『ポチ: ワンワン!』と出力されます。
echo $dog->fetch(); // 子クラス独自のメソッドも使えます。

// parent:: で親のコンストラクターを呼び出す例です。
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』と出力されます。
概要

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

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

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

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