热点网|医学教育网|北京pk10开奖直播 pk10开奖直播 北京赛车pk10 pk10开奖直播 北京赛车pk10 PK10开奖直播 北京赛车pk10开奖直播 北京pk10 北京pk10

PHP Predefined Interfaces 预定义接口

6个迭代器接口介绍
服务器君一共花费了278.439 ms进行了6次数据库查询>>,努力地为您提供了这个页面。
试试阅读模式>?希望听取您的建议

SPL提供了6个迭代器接口:

Traversable遍历接口(检测一个类是否可以使用?foreach?进行遍历的接口)
Iterator迭代器接口(可在内部迭代自己的外部迭代器或类的接口)
IteratorAggregate聚合式迭代器接口(创建外部迭代器的接口)
OuterIterator迭代器嵌套接口(将一个或多个迭代器包裹在另一个迭代器中)
RecursiveIterator递归迭代访问接口(提供递归访问功能)
SeekableIterator可索引迭代访问接口(实现查找功能)

下面对各种迭代器接口简单介绍一下:

1. Traversable

Traversable接口实际上不是一个接口,在实际写php代码中不能用>。因为只有内部的PHP类(用C写的类)才可以直接实现Traversable接口>??梢运嫡馐歉鎏匦约侗鸬亩?。实际的PHP编程中我们使用Iterator接口或者IteratorAggregate接口来实现遍历>。

Traversable {
}

Traversable 接口不能直接实现(implements).Traversable 重要的一个用处就是判断一个类是否可以遍历:

if($class instanceof Traversable)
{
     //foreach...
}

下面是官方例子:

<?php
    if( !is_array( $items ) && !$items instanceof Traversable )
        //Throw exception here
?>

2. Iterator

Iterator接口的主要用途是允许一个类实现一个基本的迭代功能>,从而使它可以被循环访问>,根据键值访问以及回滚>。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)  
} 

外部迭代器接口>,实现该接口的对象可以迭代自己内部的数据>>。

Iterator 的例子这里就不再列举了,本专题前面部分以后后续有很多例子>,具体请自行查看。

3. IteratorAggregate

又叫聚合式迭代器>。创建外部迭代器的接口>,其摘要如下:

IteratorAggregate extends Traversable {  
	//实现该方法时>,必须返回一个实现了Iterator接口的类的实例  
	abstract public Traversable getIterator ( void )  
} 

其中getIterator 方法返回值必须是能遍历或实现Iterator接口(must be traversable or implement interface Iterator)>。SPL还提供了一些专门用来与IteratorAggregate接口一起使用的内置迭代器。使用这些迭代器意味着只需要实现一个方法并实例化一个类就可以使对象可以迭代访问了>。

实例:

/**
* @author 简明现代魔法 http://www.jzjxzzjx.com
*/
class myData implements IteratorAggregate  
{  
    public $property1 = "公共属性1";  
    public $property2 = "公共属性2";  
    public $property3 = "公共属性3";  
  
    public function __construct()  
    {  
        $this->property4 = "最后一个公共属性";  
    }  
  
    public function getIterator()  
    {  
        return new ArrayIterator($this);  
    }  
}  
  
$obj = new myData;  
foreach ($obj as $key => $value) {  
    echo "键名:{$key}  值:{$value}\n";  
} 

程序输出:

键名:property1  值:公共属性1
键名:property2  值:公共属性2
键名:property3  值:公共属性3
键名:property4  值:最后一个公共属性

4. ArrayAccess

数组式访问接口>。实现该接口的对象能像数组一样使用:

ArrayAccess {
	/* Methods */
	abstract public boolean offsetExists ( mixed $offset )
	abstract public mixed offsetGet ( mixed $offset )
	abstract public void offsetSet ( mixed $offset , mixed $value )
	abstract public void offsetUnset ( mixed $offset )
}
  • ArrayAccess::offsetExists?— 检查一个偏移位置是否存在
  • ArrayAccess::offsetGet?— 获取一个偏移位置的值
  • ArrayAccess::offsetSet?— 设置一个偏移位置的值
  • ArrayAccess::offsetUnset?— 复位一个偏移位置的值

举个栗子:

/**
* @author 简明现代魔法 http://www.jzjxzzjx.com
*/
class obj implements arrayaccess {
    private $container = array();
    public function __construct() {
        $this->container = array(
            "one"   => 1,
            "two"   => 2,
            "three" => 3,
        );
    }
    public function offsetSet($offset, $value) {
        if (is_null($offset)) {
            $this->container[] = $value;
        } else {
            $this->container[$offset] = $value;
        }
    }
    public function offsetExists($offset) {
        return isset($this->container[$offset]);
    }
    public function offsetUnset($offset) {
        unset($this->container[$offset]);
    }
    public function offsetGet($offset) {
        return isset($this->container[$offset]) ? $this->container[$offset] : null;
    }
}

$obj = new obj;

var_dump(isset($obj["two"]));
var_dump($obj["two"]);
unset($obj["two"]);
var_dump(isset($obj["two"]));
$obj["two"] = "A value";
var_dump($obj["two"]);
$obj[] = 'Append 1';
$obj[] = 'Append 2';
$obj[] = 'Append 3';
print_r($obj);

5. Serializable

序列化接口>。实现该接口的类不能使用__sleep() 和__wakeup().在serialize时不执行__destruct(),在unserialize不执行__construct()。

Serializable {
	/* Methods */
	abstract public string serialize ( void )
	abstract public mixed unserialize ( string $serialized )
}

实现此接口的类将不再支持 __sleep() 和 __wakeup()>>。不论何时,只要有实例需要被序列化>,serialize 方法都将被调用>。它将不会调用 __destruct() 或有其他影响,除非程序化地调用此方法。当数据被反序列化时>>,类将被感知并且调用合适的 unserialize() 方法而不是调用 __construct()>>。如果需要执行标准的构造器,你应该在这个方法中进行处理>。

  • Serializable::serialize?— 对象的字符串表示
  • Serializable::unserialize?— 构造对象
Serializable {
	/* Methods */
	abstract public string serialize ( void )
	abstract public mixed unserialize ( string $serialized )
}

例子:

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

6. Closure

Closure {
	/* 方法 */
	__construct ( void )
	public static Closure bind ( Closure $closure , object $newthis [, mixed $newscope = 'static' ] )
	public Closure bindTo ( object $newthis [, mixed $newscope = 'static' ] )
}

这个具体还没研究>>,具体可以去看官方文档:http://www.jzjxzzjx.com/manual/en/reserved.interfaces.php

延伸阅读

此文章所在专题列表如下:

  1. 看看PHP迭代器的内部执行过程
  2. 用PHP迭代器来实现一个斐波纳契数列
  3. PHP SPL>,被遗落的宝石
  4. PHP数据结构预热:PHP的迭代器
  5. PHP Predefined Interfaces 预定义接口

本文地址:http://www.jzjxzzjx.com/librarys/veda/detail/2167>,欢迎访问原出处。

不打个分吗>?

转载随意,但请带上本文地址:

http://www.jzjxzzjx.com/librarys/veda/detail/2167

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能>>。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏。

阅读一百本计算机著作吧>,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了>>。多少是多呢>>?起码得看3>、4>>>、5、6米吧>。给个具体的数量>,那就100本书吧>。很多人知识结构不好而且不系统>,因为在特定领域有一个足够量的知识量+足够良好的知识结构>,系统化以后就足以应对大量未曾遇到过的问题>。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了>>。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话>,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官>>>,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年>>!

《链接器和加载器》 莱文(John R.Levine) (作者), 李勇 (译者)

《链接器和加载器》讲述构建程序的关键工具——链接器和加载器,内容包括链接和加载、体系结构>>、目标文件、存储分配>、符号管理、库、重定位>>>、加载和覆盖、共享库、动态链接和加载>、动态链接的共享库>,以及着眼于成熟的现代链接器所做的一些变化;并介绍一个持续的实践项目,即使用Perl语言开发一个可用的小链接器?>!读唇悠骱图釉仄鳌肥屎细咝<扑慊喙刈ㄒ档难?、实习程序员>、语言设计者和开发人员阅读参考>。

更多计算机宝库...

  • 港媒称台战机“日晒雨淋” 台军将领出面否认 2018-05-22
  • 怎样和陈意涵袁姗姗一样拥有完美裸妆肤感? 2018-05-22
  • 《东北树木彩色图志》首次载入我国新发现植物“青姬木” 2018-05-22
  • 网约车司机无证上岗拟纳入失信黑名单无证司机失信 2018-05-20
  • 300余名澳门中学生参加国旗手训练营(组图) 2018-05-20
  • 法前总统萨科齐遭拘 或因利比亚前要人递新证据 2018-05-20
  • 美媒称中国新人婚纱摄影很疯狂:有的仿如电影拍摄现场 2018-05-19
  • 立陶宛举行“汉语桥”中文比赛 2018-05-19
  • 上海嘉禾2017秋季艺术品拍卖会 2018-05-18
  • 海归回国就业创业遇到困难怎么办他帮海归找工作就业创业留学生海归 2018-05-18
  • 扛不住了?台当局拟放宽许可条件鼓励陆客赴台 2018-05-17
  • 美名校毕业典礼竞邀女性演讲者 希拉里将前往耶鲁希拉里耶鲁演讲者 2018-05-16
  • 空姐遇害案告破!DNA鉴定打捞尸体确系嫌犯刘某华 2018-05-16
  • 44年前创举!美军运输机曾空射洲际导弹 2018-05-16
  • 中部新一线城市扩容 产业定位“只看高端” 2018-05-15
  • ASP300源码下载 | 微信红包群 | 设计 | 冠珠陶瓷 | 科技 | 北京赛车pk10微信源码 | 挖段子网 | 厦门旅游景点 | 旅游中国新闻网 | 钛媒体 | 健康网hsdcba | 每天资讯 | 广西农业技术信息 | 农业种植技术 |