PHPのポリモーフィズムとは?インターフェースを使った実装例で解説
ポリモーフィズムとは何か
ポリモーフィズム(Polymorphism)は、ギリシャ語の「Poly(多数の)」と「morphism(形)」に由来する言葉で、直訳すると「多くの形」という意味になります。
オブジェクト指向プログラミングにおけるポリモーフィズムとは、異なるクラスに属していても、似たような処理を行うメソッドには同じ名前を付けるべきだという設計原則のことです。これはOOP(オブジェクト指向プログラミング)の基本的なパターンの一つであり、機能の異なる複数のクラスが共通のインターフェースを実行・共有することを可能にします。
この原則の大きな利点は、コードがどのクラスに属しているかを呼び出し側が意識する必要がないという点です。オブジェクトは同じ方法で扱えるため、コードの再利用性・保守性・拡張性が大きく向上します。
クラスにポリモーフィズムの原則を確実に実装させるためには、「抽象クラス」または「インターフェース」の2つの選択肢からいずれかを選ぶのが一般的です。本記事では、インターフェースを使ってポリモーフィズムを実装する方法を紹介します。
インターフェースとは
インターフェースはクラスとよく似ていますが、処理の中身(実装)を持つことができない点が大きな特徴です。インターフェースではメソッド名や引数を定義できますが、その内容までは定義できません。また、インターフェースを実装するクラスは、そのインターフェースで宣言されたすべてのメソッドを必ず実装しなければなりません。
実装例
次のサンプルコードでは、「Machine」という名前のインターフェースを定義し、Circle(円)クラスとRectangle(長方形)クラスがそれを実装しています。
<?php
interface Machine {
public function calcTask();
}
class Circle implements Machine {
private $radius;
public function __construct($radius){
$this -> radius = $radius;
}
public function calcTask(){
return $this -> radius * $this -> radius * pi();
}
}
class Rectangle implements Machine {
private $width;
private $height;
public function __construct($width, $height){
$this -> width = $width;
$this -> height = $height;
}
public function calcTask(){
return $this -> width * $this -> height;
}
}
$mycirc = new Circle(3);
$myrect = new Rectangle(3,4);
echo $mycirc->calcTask();
echo $myrect->calcTask();
?>
実行結果
28.274 12
コードの解説
「Machine」という名前のインターフェースは、それを実装するすべてのクラスに対して、calcTask() という抽象メソッドを定義することを義務付けています。これに従い、Circleクラスは半径から円の面積を計算する処理本体を持つ calcTask() メソッドを定義してインターフェースを実装しています。同様に、RectangleクラスもMachineインターフェースを実装していますが、幅と高さから面積を求めるという、Circleクラスとは異なる処理内容で calcTask() を定義しています。
ここでポリモーフィズムの原則が発揮されます。「タスクを計算するメソッドはどのクラスでも同じ名前にする」というルールにより、さまざまなMachineクラスのタスクを計算したい場合、内部でどのように計算が行われているのかを気にせず、単純に calcTask() を呼び出すだけでよくなります。呼び出し側が知る必要があるのは、メソッドの名前だけです。これこそが、ポリモーフィズムがもたらすメリットなのです。
-
PHPの静的メソッドとインスタンスメソッドの違いと使い分けを徹底解説
PHPでは、一般的にインスタンスメソッドが静的(static)メソッドよりも推奨される書き方とされています。しかし、だからといって静的メソッドが役に立たないわけではありません。静的メソッドには明確かつ独自の用途があります。本記事では、PHPにおける静的メソッドとインスタンスメソッドの違いや、適切な使い分けについて詳しく解説します。 まず押さえておきたい重要なポイントとして、インスタンスメソッドは常にクラスのオブジェクト(インスタンス)に紐づくのに対し、静的メソッドはクラスそのものに紐づくという違いがあります。 静的メソッドとは PHPにおける静的メソッドは、他のオブジェクト指向プログラミング
-
PHPのinterface_exists()関数とは?使い方とサンプルコードを解説
interface_exists()関数は、指定したインターフェースがすでに定義されているかどうかを確認するためのPHP組み込み関数です。name_of_interfaceで指定されたインターフェースが定義済みであればTRUEを返し、未定義であればFALSEを返します。 基本構文 interface_exists(name_of_interface, autoload) パラメータ name_of_interface − 存在を確認したいインターフェース名(文字列で指定)。 autoload − __autoload(またはSPLオートローダー)を呼び出すかどうか。デフォルトはtrueです。