【PHP】インターフェイス(interface)の使い方と解説

phpのインターフェイス解説php
書いてる人
あいりゅー

プログラミングを学びながら更新しています。
iPhone/iPad/Mac/Apple WatchなどのApple製品はこちらで主に更新しています。
麻雀の反省をひたすら掲載してるブログもやってます。

あいりゅーをフォローする

このページについて

このページではphpで使う事ができる、インターフェイスについての使い方やメリットなんかを紹介しています。

インターフェイス

そもそもインターフェイスとは一体何かってのを簡単に書くと、「中身の無い関数」となります。この中身の無い関数の事自体を「抽象メソッド」とか言ったりします。

どっちが正しいとかはありませんが、今回はインターフェイスについてなのでインターフェイスを使って解説していきます。抽象メソッドは正直「中身がない関数」としか言えないんですけどね。

インターフェイスの書き方

インターフェイスは上でも触れた通り、中身の無い関数となります。つまり関数の名前だけを宣言しておいて、中身は後々で書くよっていう使い方になります。

インターフェイス自体は以下のように書く事で使えるようになります。

interface インターフェイス名{
public function 関数1();
public function 関数2();
}

通常の関数は()の後に{}で処理を書いていたと思いますが、引数を設定する()の後には何も書きません。というか処理の中身を書いたらエラーになります。

インターフェイスの使い方

インターフェイスを宣言したら、次は中身を書きます。インターフェイスを定義するためにはclassを宣言し、implementsで使うインターフェイスを書きます。

interface インターフェイス名{
public function 関数1();
}
class クラス名 implements インターフェイス名{
public function 関数1(){
//インターフェイスの関数1の処理内容を書く
}
}

インターフェイス→クラスの順に書き、インターフェイスを使うクラスのところでimplementsで中身を書きます。

インターフェイスの注意点

インターフェイスは名前を書いて、その後のクラスで中身を実際に書くっていう使い方になるんですが、インターフェイスの注意点も把握しておきましょう。

インターフェイスは1回の宣言で何個も関数名を書く事ができます。ただしその後のimplementsで中身を書くクラスでは、すべてのインターフェイス名の中身を書かなくてはなりません。

以下は問題の無い書き方です。

interface test{
public function A();
public function B();
}
class testA implements test{
public function A(){
//インターフェイスAの処理
}
public function B(){
//インターフェイスBの処理
}
}

以下はインターフェイスで宣言した名前の数と、その後のクラス内での実装している数が異なるのでエラーとなります。

interface test{
public function A();
public function B();
}
class testA implements test{
public function B(){
//インターフェイスBの処理
}
}

インターフェイスを使う場合は必ず関数の数を一致させましょう。

例外として、abstractを付与する抽象クラスであればインターフェイスの一部だけでもOKです。

interface test{
public function A();
public function B();
}
abstract class testA implements test{
public function B(){
//インターフェイスBの処理
}
}
//エラーは出ません

抽象クラスはインスタンスの生成ができず、必ず別のクラスへ継承しなければなりません。そして、継承した別のクラスで未実装のインターフェイスを全て実装しなければなりません。

インターフェイスのメリット

インターフェイスは一体どんなメリットがあるのかいまいち分かりにくいって方もいるかと思います。ここではインターフェイスのメリットなんかを紹介します。

同じ名前だけど処理内容の異なる関数を使える

真っ先に思いつくのはこれですね。通常、同じ名前の関数は作成できずにエラーとなります。なのでそれぞれ名前を変える必要があるんですが、インターフェイスを使う事で同じ名前の関数を作る事ができます。厳密には「同じ名前の関数を持つクラス」を作成できるんですけどね。

interface test{
public function A();
}
class testA{
public function A(){
echo 'testAのA';
}
}
class testB{
public function A(){
echo 'testBのA';
}
}

$A1 = new testA;
$A1->A(); //'testAのA'

$B1 = new testB;
$B1->B(); //'testBのA'

このように同じ名前の関数を持つクラスを作成しても、問題ありません。なので内容によって同じ名前の関数を使い分けれると言えます。

複数のインターフェイスを1つのクラスに実装

インターフェイスは継承とは違うため、1つのクラスに複数のインターフェイスを書くこともできます。

interface testA {
public function A();
}

interface testB {
public function B();
}

class testClass implements testA,testB{
public function A(){
//testAのAの処理内容を書く
}
public function B(){
//testBのBの処理内容を書く
}
}

仮にtestAが不要ならtestBだけを使うといったことも可能になるので細かく分けるのも1つの手です。

staticメソッドも使える

staticメソッドとは「インスタンス化しなくても使える関数」の事を言います。インターフェイス内でまずstaticメソッドを宣言し、中身を実装するクラス側でもstaticで書きます。

interface test{
public static function A();
}

class testClass implements test{
public static function A(){
echo 'A';
}
}

//以下はstaticメソッド呼び出しの書き方
testClass::A();

このように書く事でわざわざインスタンスを生成し、インスタンスから関数を呼び出すという一連の書き方をすっ飛ばす事ができます。

同じ名前の関数を作って、処理内容は変えておいて、インスタンスを生成する必要なく呼び出せる関数一覧って書くとインターフェイスとstaticメソッドはかなり便利ですね。

インターフェイスと定数

定数とは「最初に書いたらプログラムから変更する事ができない値」の事を言います。ただしインターフェイスの定数はオーバーライド(上書き)ができるようになったため、定数というのは正しくありませんがまぁそういう感じのやつって感じでOKです。

interface test {
const A = 'testの定数(const)';
}

//以下が定数呼び出しの書き方
echo test::A;

//以下が中身書き換え
class testB implements test{
const A = '中身を書き換え';
}

//書き換え後の呼び出し
echo testB::A;

定数は簡単に言えば値が固定の変数なので、classに入れたり中身を別で書かなければならないとかいう必要はありません。呼び出す際には::というスコープ演算子を使うだけでOKです。インスタンスは必要ありません。

上書きするにはclassで中身を書き換えるだけです。この場合もインスタンスの生成などをする必要もなく、呼び出す事ができます。

列挙型にも使える

列挙型は「そのプログラム中で使う名前をまとめたやつ」みたいな感じです。インターフェイスを継承させる事で列挙型の中で関数を作成。別でクラスを書く必要なく列挙型だけで纏めておくこともできます。

まとめ

PHPのインターフェイスについて書いてきました。基本的には

  1. interfaceで名前だけ書く
  2. classにimplements演算子で継承させて中身を完成させる

という順序さえ守れば問題ありません。メリットは多いので、使いこなせるとかなり保守とか更新とか楽になりそうですね。

phpの基礎
phpとは?JavaScriptとの違いは?みたいなことから、基本の書き方などを解説。
echoとprint
画面に文字を出力する2種類の言語構造の使い方
変数
phpで使える変数の扱い方などを解説しています。
変数のスコープ(有効範囲)
変数のスコープについての解説です。
var_dump
変数の情報を見ることができる関数
print_r
変数の情報をわかりやすい形式で表示する関数
配列と連想配列
配列と連想配列の書き方と、便利な関数の解説など。
key
連想配列のキーを返してくれます。内部ポインタ関係あり。
count
配列や連想配列の要素数を数えてくれる関数の使い方解説。
ソート関数
配列に対してソートを行う関数の中から、代表的な5つの使い方解説です。
array_reverse
配列の中身の順番を反転させる関数です。
array_chunk
配列を指定した数で分割させるarray_chunk関数の使い方解説です。
array_combine
2つの配列を足して1つの連想配列にする関数です。
array_diff
2つの配列を比較して、存在しない値を出力する関数
array_push
配列に対して後方に要素を追加する関数
array_unshift
配列に対して先頭に要素を追加する関数。
array_shift
配列の先頭の要素を取り出す関数。
array_merge
複数の配列を統合して1次元の配列にする関数
array_intersect
2つの配列を比較して、両方に共通するものを出力する関数
include
includeを使って別のphpファイルを読み込む方法の解説。
if文
if文を使って処理を変更させる方法の解説。
switch文
switch文を使って複数の処理分岐を行わせたい時に使います。
forループ
forループを使って同じ処理を行わせる方法の解説です。
whileループ
whileループを使って同じ処理を行わせる方法の解説と注意点。
do-whileループ
do-whileループを使って同じ処理を行わせる方法の解説です。
foreachループ
foreachループを使って配列内のアイテム全てに処理を行う方法の解説です。
continue
ループ処理の残りをスキップしつつ、ループの先頭に戻る制御構造
ループのネスト構造(入れ子)
ループの中にループを入れる書き方や考え方の解説。
function
functionを使って自作の関数を作成・使用する方法の解説。
引数の種類と書き方解説
functionで扱う引数の種類と書き方を解説
return
returnの使い方と関数での使い方解説。
class
classを作成して変数と関数を1つにまとめる方法と使い方の解説。
constructとdestruct
classのインスタンス作成と同時に処理を行うconstructと、スクリプトの終了と同時に実行するdestructの解説です。
インターフェイス
インターフェイスという用語の解説と、実際の使い方解説
トレイト
コードを再利用するのに便利なトレイトの解説です。
列挙型
プログラム中で使う変数名をあらかじめ定義しておく。そんな感じの型。
PDOを使ってMySQLへ接続
PDOを使ってMySQLへ接続し、データを取得する方法の解説です。
データの加工と表示
PDOでデータベースから取得したデータを加工して表示する方法の解説です。
HTMLフォームのデータ受け取りと表示
HTMLで作ったフォームからのデータの受け取り方法と、その表示方法の解説です。
タイトルとURLをコピーしました