>100 Views
March 09, 15
スライド概要
RW社内勉強会用
Developer
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