Tips

2013.01.22

PHP interfaceについて 【初級編 第47回】

PHP interface

クラス

前回に引き続いて今回もクラスについて記述していきたいと思います。

インターフェイス

クラスの中で使用するメソッドが少なければ記述漏れなどは無くなるかもしれませんが、
大規模になってくると必要なメソッドの記述漏れなどが起こるかもしれません。
インターフェイスを使用するとインターフェイスに記述した機能がクラス内に記述されていない場合に
エラーを表示してくれるようにすることができます。
またインターフェイスを使用することで、そのクラスにはどんな機能があるのかといったことが、
クラスを確認しなくても分かりやすくなるといったメリットがあります。

クラスの記述方法

インターフェイスは以下のように記述します。
クラスのように interface で指定してその中にクラスの中で使用しているメソッド名を記述する形になります。
この際にインターフェイスで記述しているのに、クラス内でメソッドに記述漏れがあるとエラーになって教えてくれます。
またインターフェイスとクラスを紐づけるためにクラスを宣言する際に implements と記述します。
この動作はクラスの継承に似ていますが、派生クラスを指定する際には extends を記述して継承と呼んでいましたが、
implements でインターフェイスを指定する場合は実装と呼びます。

interface インターフェイス名{
  クラス内で記述するメソッド名1();
  クラス内で記述するメソッド名2();
  クラス内で記述するメソッド名3();
}

class クラス名 implements インターフェイス名{
  メソッド1(){
     処理;
  }
  メソッド2(){
     処理;
  }
  メソッド3(){
     処理;
  }
}

またインターフェイスを実装する際には ,(カンマ)で分けて複数のインターフェイスを一度に実装させることができます。

interface インターフェイス名1{
  クラス内で記述するメソッド名1();
}

interface インターフェイス名2{
  クラス内で記述するメソッド名2();
}


class クラス名 implements インターフェイス名1, インターフェイス名2{
  メソッド1(){
     処理;
  }
  メソッド2(){
     処理;
  }
}

インターフェイスの記述例1

以下ではインターフェイスに記述したメソッドの処理をクラス内で記述して実行しています。

<?php

  interface outs{
    public function func1();
    public function func2();
  }

  class test implements outs
    public function func1(){
      echo "in func1<br>";
    }
    public function func2(){
      echo "in func2<br>";
    }
  }

  $obj = new test;
  $obj->func1();
  $obj->func2();

?>

結果は以下のように通常通りクラスのメソッドを実行できます。
ブラウザ確認画像

クラス内でメソッドの記述漏れがあった場合

インターフェイスを実装しているクラス内でメソッドの記述漏れがあった場合、
以下のようにエラーが表示されます。

<?php

  interface outs{
    public function func1();
    public function func2();
  }

  class test implements outs{
    public function func1(){
      echo "in func1<br>";
    }
  }

  $obj = new test;
  $obj->func1();
  $obj->func2();

?>

結果は以下のようになります。
ブラウザ確認画像

インターフェイスの記述例2

以下のように shigoto というインターフェイスをクラスで実装した場合には必ず hataraku(), yasumu(), kyuuryou() といったメソッドを含まなければならないということになります。
するとクラスの内容を見なくてもインターフェイスを見ることでどんな機能を持っているかが分かりやすくなります。

<?php
  interface shigoto{
    public function hataraku();
    public function yasumu();
    public function kyuuryou();
  }

  class shop implements shigoto{

    public $tairyoku = 3;
        public $shukkin = 0;
        public $okane = 1000;

    public function hataraku(){
          $this->tairyoku -= 1;
          $this->shukkin += 1;
          echo "働く --> 体力 ".$this->tairyoku.", 出勤回数".$this->shukkin."<br>";
          if($this->tairyoku == 0){
            echo "---> Die...<br>";
                $this->tairyoku = 3;
          }
        }
        public function yasumu(){
          $this->tairyoku += 1;
          echo "休む --> 体力".$this->tairyoku."<br>";
          if($this->tairyoku <= 3){
            $this->tairyoku = 3;
          }
        }
        public function kyuuryou(){
          if($this->shukkin <= 4){
            echo "給料 --> 出勤回数".$this->shukkin."回, まだ出ない<br>";
          }
      if($this->shukkin == 5){
            echo "給料 --> 出勤回数".$this->shukkin."回, 出ました<br>";
                $this->okane += 1000;
            echo "お金".$this->okane."円に増えました。<br>";
          }
        }
  }

  $tenin = new shop;
  echo "ステータス<br>";
  echo "&nbsp 体力: ".$tenin->tairyoku."<br>";
  echo "&nbsp 出勤回数: ".$tenin->shukkin."<br>";
  echo "&nbsp お金: ".$tenin->okane."<br>";
  $tenin->hataraku();
  $tenin->hataraku();
  $tenin->kyuuryou();
  $tenin->yasumu();
  $tenin->hataraku();
  $tenin->hataraku();
  $tenin->kyuuryou();
  $tenin->hataraku();
  $tenin->kyuuryou();

?>

この場合の結果は以下のようになります。
ブラウザ確認画像

今回はここまでにします。

新連載はじまりました!新PHP基礎 連載リンク

PHP基礎 連載

Recent News

Recent Tips

Tag Search