INTERFACEで
オブジェクトクラスの
動作を保証する
2015/03
RW社内勉強会用
岡本秀高
できること
Interfaceを使うと、
クラスの中身を保障することが
可能になる
INTERFACEとは?
INTERFACEとは?
抽象メソッドを定義するクラスの様なもの。
抽象メソッドのみなので、
メソッドの中身を定義することはできない。
例えばこんな感じ
interface alerm{
public function start();
public function alert();
public function stop();
}
class AlermClock implements alerm{
public function start(){echo 'start!';}
public function alert(){echo 'alerm!';}
public function stop() {echo 'stop';}
}
使用時のポイント
interface alerm{
public function start();
public function alert();
public function stop();
}
class AlermClock implements alerm{
public function start(){echo 'start!';}
public function alert(){echo 'alerm!';}
public function stop() {echo 'stop';}
}
Interfaceで定義して、
Implementsで実装させる。
便利な「定義済みINTARFACE」
PHPにデフォルトで定義されているInterfaceを使うと、
オブジェクトを配列っぽく扱うような
通常あり得ない動きをするクラスを作れる。
オブジェクト内の配列を数える
class ArrayLike{
protected $_arr;
public function __construct($arr = array()) {
$this->_arr = $arr;
}
}
$arrObj = new ArrayLike(array('foo', 'bar', 'baz'));
echo count($arrObj), PHP_EOL; //本来なら3なのに1になる
INTERFACEを使って数える
class ArrayLike implements Countable{
protected $_arr;
public function __construct($arr = array()) { $this->_arr = $arr; }
public function count() { return count($this->_arr); }
}
$arrObj = new ArrayLike(array('foo', 'bar', 'baz'));
echo count($arrObj), PHP_EOL; //→3が表示される
CLASSの中身を変えただけ
class ArrayLike implements Countable{
protected $_arr;
public function __construct($arr = array()) { $this->_arr = $arr; }
public function count() { return count($this->_arr); }
}
$arrObj = new ArrayLike(array('foo', 'bar', 'baz'));
echo count($arrObj), PHP_EOL; //→3が表示される
こんなこともできる
$arrObj = new ArrayLike (array('foo', 'bar', 'baz'));
foreach ($arrObj as $key => $value) {
echo $key . $value . ’ , ’ ; // →0foo , 1bar , 2baz ,
}
*定義済みInterfaceの「Iterator」を使用すると、
オブジェクトなのにforeachで中身が取り出せた。
さらにはこんなことも
$arrObj = new ArrayLike (array('foo', 'bar', 'baz'));
$arrObj[1] = ‘直接追加';
echo $arrObj[1]; // =>直接追加
*普通なら「Fatal error: Cannot use object of type ArrayLike as array 」
*定義済みInterfaceの「ArrayAccess」を使用すると、
オブジェクトなのに直接配列を操作できる。
ちなみに
「ArrayObject」という
オブジェクトを配列として動かすクラスが
デフォルトで存在する。
PHP: ArrayObject - Manual : http://php.net/ArrayObject
INTERFACEを使うメリット
・そのクラスにあるメソッドが一発でわかる
・タイプヒンティングにも使える
・定義済みInterfaceでクラスをいじり倒せる
TRY IT!
・PHPのオブジェクト指向入門 | オブジェクト指向PHP.NET :
http://www.objective-php.net/basic/interface
・PHPのinterfaceとは何か - 泥のように :
http://blog.tojiru.net/article/377526320.html
・5 分で分かる PHP の組込みインターフェイス - Born Too Late :
http://blog.yuyat.jp/archives/992

Phpのinterfaceを使う