在PHP中有好几个预定义的接口,比较常用的四个接口(Countable、ArrayAccess、Iterator、IteratorAggregate(聚合式aggregate迭代器Iterator)).

  1. Countable接口

  从手册上看到,主要是 类实现 Countable 可被用于 count() 函数.

  示例:  

<?php

class ConutMe
{
protected $_myCount = 3; public function count()
{
return $this->_myCount;
}
} $countable = new ConutMe();
echo count($countable); ///result is "1", not as expected //实现接口Countable
class CountMe implements Countable
{
protected $_myc = 4; public function count()
{
return $this->_myc;
}
} $countable = new CountMe();
echo count($countable);//result is "4" as expected

  总结:

  Countable这个接口用于统计对象的数量,当对一个对象调用count的时候,如果类(如CountMe)没有继承Countable,将一直返回1,如果继承了Countable会返回所实现的count方法所返回的数字.

  2. ArrayAccess接口

  非常常用,各大框架都会实现这个接口. 主要功能: 提供像访问数组一样访问对象的能力的接口。(详细看已经写的 php使用数组语法访问对象 )

3.Iterator接口 (可在内部迭代自己的外部迭代器或类的接口。)

  (自己水平比较low,暂时没发现什么好处). 

  记录下执行的流程

  

 <?php
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; //记录步骤
//1. 在第一次循环迭代之前, Iterator::rewind() is called
//2. 在每次循环迭代中, Iterator::valid() is called
//3. 如果Iterator::valid() 返回 false , 循环结束
// 如果Iterator::valid() 返回 true , Iterator::current() is called and Iterator::key() is called.
//4. 返回当前迭代器的值 echo
//5. 在每一次迭代后, Iterator::next() is called , 然后又从 步骤2开始执行. foreach($it as $key => $value) {
echo $key,'-',$value;
echo "\n";
}
/*
* 输出的结果
* myIterator::rewind 重置迭代器(返回到迭代器的第一个元素)
*
* myIterator::valid 检查当前位置是否有效
* myIterator::current
* myIterator::key
* 0-firstelement
* myIterator::next
*
* myIterator::valid
* myIterator::current
* myIterator::key
* 1-secondelement
* myIterator::next
*
* myIterator::valid
* myIterator::current
* myIterator::key
* 2-lastelement
* myIterator::next
*
* myIterator::valid
*
* 循环结束
*
*/ ?>     

  4.IteratorAggregate接口 (创建外部迭代器)

 class my implements IteratorAggregate
{
private $arr = [];
const TYPE_INDEXED = 1;
const TYPE_ASSOCIATIVE = 2; public function __construct(array $data,$type = self::TYPE_INDEXED)
{
reset($data);
//each 返回当前数组的键值,并且指针向前移动一步
while (list($k,$v) = each($data)){
$type == self::TYPE_INDEXED ? $this->arr[] = $v :
$this->arr[$k] = $v;
}
/*
print_r($this->arr);
exit();
*/
} public function getIterator()
{
//对 属性arr迭代
return new ArrayIterator($this->arr);
}
} //返回一个迭代器
$obj = new my(['one'=>'php','javascript','three'=>'c#','java',], 1 ); //迭代
foreach ($obj as $key=>$value){
var_dump($key,$value);
echo "<br/>";
}

  总结: 如果对一个普通对象循环,只是会输出此对象的 public属性, 如果对象实现了 IteratorAggregate 接口 ,是可以通过参数对 指定数据进行迭代.

    (例如上例的私有属性arr)

 

 

    

php SPL常用接口的更多相关文章

  1. CSharpGL(2)设计和使用场景元素及常用接口

    CSharpGL(2)设计和使用场景元素及常用接口 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入 ...

  2. JDBC常用接口详解

    JDBC中常用接口详解 ***DriverManager 第一.注册驱动 第一种方式:DriverManager.registerDriver(new com.mysql.jdbc.Driver()) ...

  3. Servlet API遍程常用接口和类

    本文主要总结Servlet  API遍程常用接口和类 Servlet API http://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html ...

  4. 液晶常用接口“LVDS、TTL、RSDS、TMDS”技术原理介绍

    液晶常用接口“LVDS.TTL.RSDS.TMDS”技术原理介绍 1:Lvds Low-Voltage Differential Signaling 低压差分信号 1994年由美国国家半导体公司提出之 ...

  5. Java实战之02Hibernate-01简介、常用接口、CRUD操作

    一.Hibernate简介 1.Hibernate在开发中所处的位置 2.ORM映射 Object :面向对象领域的 Relational:关系数据库领域的 Mapping:映射 Object: Re ...

  6. Hibernate常用接口

    Hibernate的接口类型 在了解了Hibernate的基本配置,映射文件后,道路已经铺平了.我们继续往前走.接下来,我们应该做的是了解Hibernate常用的接口,对Hibernate的工作方式进 ...

  7. 【转】Android LCD(二):LCD常用接口原理篇

    关键词:android LCD TFT TTL(RGB)  LVDS  EDP MIPI  TTL-LVDS  TTL-EDP 平台信息:内核:linux2.6/linux3.0系统:android/ ...

  8. JDBC数据库编程常用接口(转)

    JDBC的全称是Java DataBase Connectivity,是一套面向对象的应用程序接口(API),制定了统一的访问各种关系数据库的标准接口,为各个数据库厂商提供了标准接口的实现.这东西能够 ...

  9. C# 常用接口学习 ICollection<T>

    C# 常用接口学习 ICollection<T> 作者:乌龙哈里 时间:2015-11-01 平台:Window7 64bit,Visual Studio Community 2015 参 ...

随机推荐

  1. python3百度指数抓取

    百度指数抓取,再用图像识别得到指数 前言: 土福曾说,百度指数很难抓,在淘宝上面是20块1个关键字: 哥那么叼的人怎么会被他吓到,于是乎花了零零碎碎加起来大约2天半搞定,在此鄙视一下土福 安装的库很多 ...

  2. [linux] FastDFS访问文件,400 Bad Request

    linux 安装nginx,FastDFS后,启动访问指定文件出错, 文件名称格式化错误. 解决办法: vi /etc/fdfs/mod_fastdfs.conf 将 url_have_group_n ...

  3. StackOverflow程序员推荐的几本书籍

    1. <代码大全>史蒂夫·迈克康奈尔 推荐数:1684 “优秀的编程实践的百科全书,<代码大全>注重个人技术,其中所有东西加起来,就是我们本能所说的“编写整洁的代码”.这本书有 ...

  4. 【uTenux实验】邮箱

    邮箱是一个通过在系统(共享)内存空间传递消息来实现同步和通信的对象.uTenux中每个邮箱都包含一个用来发送消息的消息队列和一个用于等待接收消息的任务队列,其使用邮箱功能的消息内容放置在发送方和接收方 ...

  5. rsync+sersync实现文件实时同步

    前言: 一.为什么要用Rsync+sersync架构? 1.sersync是基于Inotify开发的,类似于Inotify-tools的工具 2.sersync可以记录下被监听目录中发生变化的(包括增 ...

  6. redis shell命令大全

    redis shell命令大全(转自http://blog.mkfree.com/posts/5105432f975ad0eb7d135964) 作者:oyhk   2013-1-28 3:11:35 ...

  7. 发送短信(string转换为JSON)

    using Newtonsoft.Json;using System;using System.Collections.Generic;using System.Linq;using System.T ...

  8. 全面了解 Linux 服务器 - 4. 查看 Linux 系统的平均负载

    可使用 uptime.top.w 命令来查看. 以 uptime 命令为例: liuqian@ubuntu:~$ uptime 17:31:26 up 7:27, 2 users, load aver ...

  9. (转载)RESTORE DATABASE命令还原SQLServer 2005 数据库

    今天恢复一个SQLServer2008R2,发现问题,然后通过园友的文章解决了问题,特记录备用 原文地址:http://www.cnblogs.com/adandelion/archive/2006/ ...

  10. php源码之计算两个文件的相对路径

    <?php //计算出两个文件的相对路径即path2相对于$path1的相对路径 // http://www.manongjc.com/article/1342.html function ge ...