PHPのIterator、ArrayAccess、Countableインタフェース

4761 ワード

インタフェース(interface)を使用すると、クラスがimplementsとして実装されるクラスタメソッドを指定できます.クラスは複数のインタフェースを実装し、カンマで複数のインタフェースの名前を区切ることができます.
理屈で言えばinterfaceはPHP開発において逆転原則に依存する重要な力であるが、PHPの弱いタイプの特性はその地位を非常に気まずくさせ、多くの継承のためにプロジェクトの中で何をしたこともない.
PHPが提供する複数のインタフェースは主にオブジェクトに配列を試用させる操作方式であるが、ここでは主にIterator、ArrayAccess、Countableを紹介するついでにPHP 5を紹介する.5以降のジェネレータyield
1.Iteratorインタフェース
Iteratorは、foreach、while方式を使用して自分の外部反復器やクラスのインタフェースを内部で反復することができます.
インタフェースの定義は次のとおりです.
Iterator extends Traversable {
abstract public function current ()
abstract public function key ()
abstract public function next ()
abstract public function rewind ()
abstract public function valid ()
}

例:
<?php
     class  Basket implements Iterator{
          private $fruits =array('apple','banna','pear','orange','watermelon');
          //     
          private $posistion =0;
          /**
          *           
          */
          public  function current (){
               return $this->fruits[$this->posistion];
          }
          /**
          *       key   
          */
          public  function key (){
               return $this->posistion;
          }
          /**
          *      
          */
          public  function next (){
               ++$this->posistion;
          }
          /**
          * foreach         
          */
          public  function rewind (){
               $this->posistion =0;
          }
          /**
          *      key     ,  true   ,false     
          */
          public  function valid (){
               if($this->posistion<count($this->fruits)) return true;
               return false;
          }
     }


     $basket  = new Basket();
     foreach($basket as $key=>$fruit){
          echo $key ,'--',$fruit,"
"; } // , while($basket->valid()){ echo $basket->key(),'--',$basket->current(),"
"; $basket->next(); }

2.ArrayAccessインタフェース
ArrayAccessは、配列にアクセスするようにオブジェクトにアクセスする機能を提供するインタフェースであり、要素にカッコインデックスでアクセスできる機能です.
ArrayAccess {
     abstract public   offsetExists ( mixed $offset )//isset($object['name'])    
     abstract public   offsetGet ( mixed $offset )//var_dump($object['name'])    
     abstract public   offsetSet ( mixed $offset , mixed $value )//$object['name']='shiki'    
     abstract public   offsetUnset ( mixed $offset )//unset($object['name'])    
}

具体例は参照できる
https://github.com/Himer/joy/blob/master/PageGenerator.php
例では、データベースのlimitフィールドなどのページに必要なデータを配列呼び出しで取得するために実装されます.
$page= new PageGenerator(array('nowPage' =>$i ,'itemCount'=>198,'perPage'=>10 ));
var_dump($page[3]);

array(4){["maxPage"]=>int(20),["limitFront"]=>int(20),["limitBack"=>int(10),["nowPage"=>int(3)}limitFrontとlimitBackを組み合わせてデータベースにデータを取得
3.countableインタフェース
オブジェクトをcount関数に使用できるようにする能力
次のように定義します.
Countable {
     abstract public function count ( )
}

例:
<?php
     class  Basket implements Countable{
          private $fruits =array('apple','banna','pear','orange','watermelon');
          public function count(){
               return count($this->fruits);
          }
     }
     $basket = new Basket();
     var_dump(count($basket));

3つのインタフェースの紹介が終わりました.yieldについてお話しします.最初にyieldに接触したときやpythonを習ったとき、yieldは一般的な関数のように結果を返して終了するのではなく、結果が戻った後に自動的に一時停止したときの実行状態、すなわちジェネレータの内部状態(すなわちコンテキスト情報)を保存し、関数が呼び出されたときに保存された情報を復元して有効にし、yieldの後の文を実行し続けます.次のyieldやreturnに出会うことを知っています.
例:
<?php
function xrange($start, $limit, $step = 1) {
    for ($i = $start; $i <= $limit; $i += $step) {
        yield $i;
    }
}

echo 'Single digit odd numbers: ';

/*                      */
foreach (xrange(1, 9, 2) as $number) {
    echo "$number ";
}
?>