「インターフェース」ってよく聞きますが、あんまりわかってないです。
というか全くわかりません、「インターフェース」って言いたいだけです。
PHP conference Kansai2018で
「インターフェース再入門」というセッションがあり、
そこから気になりだしたので探ってみます。
会社で、PHP conference Kansai2018共有LTしたので、
もうちょい深いところつつけたらなと思います。
ちなみに過去に私が書いたPHP conference Kansai2018の記事はこちら
インターフェースとは…
何か目的を果たすための手段となるもの。
中身を知らなくても使う側は使うことができる。
例えば…
ECサイト(「ブーメラン」を売っているお店とする)で考えると
- 使い手 = 買い手
- 目的 = 「ブーメラン」をクレジットカードで購入したい
- 手段 = 決済モジュールのクレジットカード決済
→ この時のインターフェースは「決済モジュール」になります!
例えば…(パート2)
- 使い手 = わたし
- 目的 = 青い空の下で音楽を聞きながら、お酒飲みたい!
- 手段 = フェスに行く
→ この時のインターフェースは「フェス」になります!
↑をPHPで書いてみます!
〜InterfaceとAbstract使って〜
実際に書いてたらabstractとの違いがわかんなくなってきたので、両方使ってみます。
参考:
https://havelog.ayumusato.com/develop/php/e166-php-interface-abstract.html
\ Github – kin29/fes /
- GoodFesInterface.php ←Interface。
- AbstractFes.php ←Abstract。(WildBunchFesの継承クラス)
- WildBunchFes.php ← AbstractFesを継承し、GoodFesInterfaceを使用
- Watashi.php ←わたし(使い手)
◎ 前提
「青い空の下で音楽を聞きながら、お酒飲みたい!」という、
わたしの願いを叶えるための良いフェスの必須条件を
「GoodFesInterface.php」 にこめています。
さらに、わたしが今年の夏に楽しんだフェス
「WildBunchFes(通称WBF)」 「CircleFukuoka」 「まつり宮崎」 「AoshimaBeachParkFes」。
これら4つに共通するもの、
「音楽」 「酒」 「晴れ」 「野外」 「フェスの名前」 「思い出」を
「AbstractFesクラス」 に詰め込んで各Fesで継承しています。
GoodFesInterface.php [Interface]
<?php namespace Fes; interface GoodFesInterface { public function isMusic(); public function isDrink(); public function isSunny(); public function isOutdoor(); }
AbstractFes.php [Abstract class]
<?php namespace Fes; abstract class AbstractFes { public $fes_name; public $music; public $drink; public $place; public $weather; public $memory; public function __construct() { $this->place = '野外'; $this->weather = '快晴'; $this->memory = 'フェス最高 ^ω^'; } /** * @return string */ public function getFesName() { return $this->fes_name; } /** * @return bool */ public function isMusic() { return isset($this->music); } /** * @return bool */ public function isDrink() { return isset($this->drink); } /** * @return bool */ public function isOutdoor() { return ($this->place === '野外'); } /** * @return bool */ public function isSunny() { return ($this->weather === '快晴'); } /** * @return string */ public function getMemory() { return $this->memory; } }
WildBunchFes.php
<?php namespace Fes; class WildBunchFes extends AbstractFes implements GoodFesInterface { public $fes_name; public $music; public $drink; public $memory; public function __construct() { parent::__construct(); $this->fes_name = '「ワイルドバンチ」'; $this->music = 'ヤバT/サカナクション/スカパラ/10-FEET/フォーリミ/teto/ハルカミライ...etc'; $this->drink = 'ビール、ビール'; $this->memory = 'しかし、2日目は台風直撃で中止になりました。'; } }
Watashi.php
<?php namespace Bootstrap; require dirname(__DIR__) . '/vendor/autoload.php'; use Fes\WildBunchFes; ... class Wahatashi { public $wbf; ... public function __construct() { $this->wbf = new WildBunchFes(); ... } public function done() { $arrRet = array(); $arrRet[get_class($this->wbf)] = $this->doneList($this->wbf); ... var_dump($arrRet); } public function doneList($class) { $arrRet = array(); foreach ($this->arrDoList as $item){ $arrRet[$item] = $class->{$item}(); } return $arrRet; } } $i_am = new Wahatashi(); $i_am->done();
Watashi.phpは、
WildBunchFesクラスを通して、GoodFesInterfaceを使って(手段)として、
目的を果たしています。ですよね?w
まだまだ私の理解が乏しく、間違っている部分もあるかと思います。
そして、「こんなソースいつ使うんだ?」って感じですが、
自分の好きなものでソースを書くってなかなか面白かったです。
みなさんもぜひしてみてください! \(^^)/