`
OrangeHolic
  • 浏览: 260736 次
  • 来自: 北京
社区版块
存档分类
最新评论

PHP中的Iterator、ArrayAccess、Countable接口

    博客分类:
  • PHP
 
阅读更多
使用接口(interface),可以指定某个类必须实现(可空实现)一簇方法,实现关键字为  implements, 类可以实现多个接口,用逗号来分隔多个接口的名称。
按理说interface是PHP开发中依赖倒置原则的重要力量,但是PHP弱类型特性使其地位非常尴尬,除非为了多继承,在项目中还真没有它来干过啥。
PHP提供的多个接口主要是让对象试用数组的操作方式,在此主要介绍一下Iterator、ArrayAccess、Countable 顺便介绍一下PHP5.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,"\n";
     }
     //也可用下面的遍历方式,效果一样
     while($basket->valid()){
          echo $basket->key(),'--',$basket->current(),"\n";
          $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组合成limit到数据库取数据

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));


三个接口介绍完了,下面来说说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 ";
}
?>

分享到:
评论

相关推荐

    php SPL IteratorAggregate_ArrayAccess_Countable_ArrayObject接口简单用法

    在PHP中,SPL(Standard PHP Library)是标准库的简称,它提供了一系列的接口、类和异常,用于实现常见的编程任务,如迭代器、数组访问、比较等。本篇文章将详细探讨`IteratorAggregate`, `ArrayAccess`, `Countable...

    PHP中预定义的6种接口介绍

    本文将详细介绍PHP中预定义的6种接口:Traversable、Iterator、IteratorAggregate、ArrayAccess、Countable和Serializable。 1. **Traversable遍历接口** Traversable接口虽然在PHP中不能直接被类实现,但它是一个...

    array-abstraction:实现 ArrayAccessIteratorCountable 接口的本机数组和对象的抽象

    实现 ArrayAccess/Iterator/Countable 接口的内置数组和对象的抽象。 这个库旨在抽象出 PHP 内置数组和不同接口对象之间的差异,可以实现以挂钩到数组语法。 PHP 有许多用于数组的内置函数,但它们只适用于内置...

    PHP的SPL标准库的用法介绍.pdf

    - SPL定义了一些接口,如`ArrayAccess`, `Countable`, `Traversable`, `Serializable`等,它们扩展了PHP的基础功能。例如,`ArrayAccess`接口允许一个对象像数组一样被访问,`Countable`接口提供了`count()`方法来...

    PHP之预定义接口详解

    本文将深入探讨四个常用的预定义接口:IteratorAggregate、Countable、ArrayAccess以及Iterator,并通过示例代码来解释它们各自的功能。 1. IteratorAggregate 接口: IteratorAggregate 是一个用于创建外部迭代器...

    Database Access Through Arrays for PHP5-开源

    在PHP5中,SPL数组访问接口允许自定义类实现ArrayAccess, Iterator, 和 Countable等接口,使得对象可以被当作数组来处理。ArrayAccess接口定义了四个方法:offsetExists(), offsetGet(), offsetSet(), 和 ...

    php函数列表

    - **ArrayIterator**:提供了遍历数组或实现Countable和ArrayAccess接口的对象的能力。 #### 结论 PHP的强大之处在于其丰富的函数库,覆盖了从基础数学运算到高级框架集成的广泛领域。掌握这些函数的用法,能够...

    PHP 双链表(SplDoublyLinkedList)简介和使用实例

    该类实现了Iterator、ArrayAccess、Countable三个接口,这意味着SplDoublyLinkedList对象可以像数组一样进行遍历,并且可以进行计数。具体来说: - Iterator接口允许用户通过next(), prev(), current(), key() 和...

    PHP SPL使用方法和他的威力

    1. **数组操作接口:** SPL扩展了PHP中的数组操作功能,提供了如`ArrayAccess`(允许数组风格访问对象)、`Countable`(可以通过count()获取对象中的元素数量)和`SeekableIterator`(允许在迭代器中前后移动指针)...

    PHP SplObjectStorage使用实例

    1. **Countable**:使你可以通过`count()`函数获取存储中的对象数量。 2. **Iterator**:允许你像遍历数组一样遍历存储中的对象。 3. **Serializable**:支持对象的序列化和反序列化,可以保存和恢复对象的状态。 4....

    PHP SPL标准库之SplFixedArray使用实例

    SplFixedArray类实现了一些常见的接口,如Iterator、ArrayAccess和Countable,使其能够作为数组一样使用,同时又能提供迭代器的功能。类中的方法包括: - __construct(int $size = 0):构造函数用于创建指定大小的...

    PHP SPL 被遗落的宝石【SPL应用浅析】

    SPL为PHP提供了许多增强功能,包括ArrayAccess、Countable和SeekableIterator等接口,使得对象能够像数组一样操作。此外,RecursiveIterator和ArrayObject等迭代器允许开发者更灵活地遍历和处理数据。SPL还包括一些...

    collection:PHP 集合

    #Collection (PHPExtra\Type\Collection) ##用法集合通过实现以下接口解决了一些问题: \Countable 、 \ArrayAccess 、 \Iterator和\SortableInterface 。 这使您能够count()集合,在其上使用foreach ,像数组$a[1...

Global site tag (gtag.js) - Google Analytics