PHP7.4.1におけるインターフェイスについて。
declare(strict_types=1);
//インターフェイスの定義
interface If1 {
public function getI1(): string; //このメソッドが存在しないクラスはErrorを出す
}
//cl1クラスの定義
class Cl1 implements If1 { //Cl1クラスにIf1インターフェイスを実装
//プロパティの定義
private string $i1;
//コンストラクター
public function __construct(string $i1) {
$this->i1 = $i1; //Cl1クラスのインスタンス作成時のパラをi1に代入
}
//i1プロパティのセッター
public function setCl1(string $i1) {
$this->i1 = $i1; //今回はいらない
}
//i1プロパティのゲッター
public function getI1(): string { //この宣言部分をインターフェイスと同じにする
return $this->i1; //処理の内容に制限はない
}
}
class Cl2 implements If1 { //Cl2クラスにIf1インターフェイスを実装
//プロパティ
public string $i1;
//コンストラクター
public function __construct(string $i1) {
$this->i1 = $i1;
}
//ゲッター
public function getI1(): string { //この宣言部分をインターフェイスと同じにする
return $this->i1; //処理の内容は自由
}
}
$Cl1 = new Cl1('げその天ぷら');
$Cl2 = new Cl2('天空ぺけ字拳');
echo $Cl1->getI1(), "\n"; //げその天ぷら
echo $Cl2->getI1(), "\n"; //天空ぺけ字拳
インターフェイスとは、クラスがある特定のメソッドを持っていることをルール化するオブジェクト指向の仕組みのことです。
今回はIf1という名前のインターフェイスを作りました。
このインターフェイスを実装すると、そのクラスはインターフェイス内で定義されているものと同じメソッドが存在しなければ問答無用でFatal Errorになるというルールを強制されます。
インターフェイスをクラスに実装するには、クラス宣言の行のクラス名の後ろに続けて implements 〇〇 と記述すればOKです。
この〇〇の部分には、実装したいインターフェイス名が入ります。
ちなみにもしインターフェイスを実装したクラスをサブクラスとして使いたい場合は、extends 〇〇 の記述はimplementsよりも前に書きます。
もしimplements 〇〇 の記述よりも後ろにextendsを書くとParse Errorが出ます。
閑話休題。
上記のスクリプトにあるCl2クラスのプロパティはpublicです。
なので本来であればコンストラクターもゲッターも必要ありません。
ですがCl2クラスはIf1インターフェイスを実装してしまっているので、必要かどうかにかかわらずとにかく public function getI1(): string {} を定義しなければいけません。
このメソッドがどのような処理をするのかには制限はありません。
ですがとにかくこれと同名のpublicでstring指定のメソッドがなければ、コンピュータくんは問答無用でFatal Errorを出してきます。
インターフェイス宣言の定形は以下のとおりです。
interface 〇〇 {
アクセス修飾子 function メソッド名(引数1, ...): データ型;
}
〇〇の部分にはインターフェイス名が入ります。
インターフェイスで定義できるのは宣言部分までです。
通常のメソッドであるようなブレイス(波括弧)とその中身の処理は、インターフェイスでは書いてはいけません。
もしインターフェイスでメソッドの宣言より後の部分を記述するとErrorが出ます。
また、インターフェイスではプロパティを定義することもできません。
以上です。