php Iterator(迭代器)接口

迭代器或类的接口。

Iterator extends Traversable  
{  
    //返回当前索引游标指向的元素  
    abstract public mixed current(void)  
    //返回当前索引游标指向的元素的键名  
    abstract public scalar key(void)  
    //移动当前索引游标指向下一元素  
    abstract public void next(void)  
    //重置索引游标的指向第一个元素  
    abstract public void rewind(void)  
    //判断当前索引游标指向的是否是一个元素,常常在调用 rewind()或 next()使用  
    abstract public boolean valid(void)  
} 

scalar 标准变量 整型、字符串、浮点型等

$a="hello word";
$obj=(object)$a;
echo $obj->scalar;
//输出 "hello word"

class myIterator implements Iterator {
    private $position = 0;
    private $array = array(
            "firstelement",
            "secondelement",
            "lastelement",
    );

    public function __construct() {
        $this->position = 0;
    }

    function rewind() {
//         var_dump(__METHOD__);
        $this->position = 0;
    }

    function current() {
//         var_dump(__METHOD__);
        return $this->array[$this->position];
    }

    function key() {
//         var_dump(__METHOD__);
        return $this->position;
    }

    function next() {
//         var_dump(__METHOD__);
        ++$this->position;
    }

    function valid() {
//         var_dump(__METHOD__);
        return isset($this->array[$this->position]);
    }
}

$it = new myIterator;

foreach($it as $key => $value) {
    echo "{$key}|{$value}";
    echo "\n";    
}

输出结果:

0|firstelement
1|secondelement
2|lastelement

Traversable 预定义接口

Traversable {

}

作用:检测一个类是否可以使用 foreach 进行遍历的接口。
php代码中不能用。只有内部的PHP类(用C写的类)才可以直接实现Traversable接口

IteratorAggregate
预定义接口(对Iterator的委托)

class myDataArray implements IteratorAggregate {
    private $_d = array('a','b','c','d');

    public function __construct() {
        $this->_d[] =   "last property";
    }

    public function getIterator() {
        return new ArrayIterator($this->_d);
    }
}

$obj = new myDataArray;

foreach($obj as $key => $value) {
    var_dump($key, $value);
    echo "\n";
}

ArrayAccess

PHP的ArrayAccess接口 像数组一样来访问你的PHP对象

class Test implements ArrayAccess {
        
    private $elements;
    
    public function offsetExists($offset){
        return isset($this->elements[$offset]);
    }
    
    public function offsetSet($offset, $value){
        $this->elements[$offset] = $value;
    }
    
    public function offsetGet($offset){
        return $this->elements[$offset];
    }
    
    public function offsetUnset($offset){
        unset($this->elements[$offset]);
    }
}

$test = new Test();
$test['test'] = 'test';//自动调用offsetSet
if(isset($test['test']))//自动调用offsetExists
{
    echo $test['test'];//自动调用offsetGet
    echo '<br />';
    unset($test['test']);//自动调用offsetUnset
    var_dump($test['test']);
}

Lararel中常常使用比如$this['config']

SeekableIterator 预定义接口

对接口Iterator的扩展
在接口中可以 seek

SeekableIterator extends Iterator {
/* 方法 */
abstract public void seek ( int $position )
/* 继承的方法 */
abstract public mixed Iterator::current ( void )
abstract public scalar Iterator::key ( void )
abstract public void Iterator::next ( void )
abstract public void Iterator::rewind ( void )
abstract public boolean Iterator::valid ( void )

Serializable

扩展接口,对类序列化就是对类内对应方法数据序列反序列化

class obj implements Serializable {
    private $data;
    public function __construct() {
        $this->data = ["My private data"];
    }
    public function serialize() {
        return serialize($this->data);
    }
    public function unserialize($data) {
        $this->data = unserialize($data);
    }
    public function getData() {
        return $this->data;
    }
}

$obj = new obj;
$ser = serialize($obj);

$newobj = unserialize($ser);

var_dump($newobj->getData());

Countable

能够对对象实现count操作

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));
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 一 预定义接口 1.1 遍历 Traversable(遍历)接口 检测一个类是否可以被foreach遍历,该接口不...
    coderhu阅读 1,196评论 0 0
  • PHP 学习目录 ├─PHP视频教程 1 LAMP网站构建 │ ├─PHP教程 1.1.1 新版视频形式介绍│ ...
    曹渊说创业阅读 16,147评论 29 417
  • Php:脚本语言,网站建设,服务器端运行 PHP定义:一种服务器端的HTML脚本/编程语言,是一种简单的、面向对象...
    廖马儿阅读 2,114评论 2 38
  • 记得有一次,我的几个大学朋友一起来我家乡,他们先到我家拜访过,吃完晚饭后,我就带他们去了市区。 说实话,在他们来之...
    go孙行者110阅读 432评论 0 2