使用接口(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 ";
}
?>
分享到:
相关推荐
程序人生java Iterator接口的知识总结,在做项目的时候碰到很多像这样的问题,于是在比较全面的查找资料下,总结了这份资料,不好勿喷!
Iterator接口在集合中的使用方法!
struts2中iterator 标签的使用详解
主要介绍了Java Iterator接口实现代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了java Iterator接口和LIstIterator接口分析的相关资料,需要的朋友可以参考下
实现 ArrayAccess/Iterator/Countable 接口的内置数组和对象的抽象。 这个库旨在抽象出 PHP 内置数组和不同接口对象之间的差异,可以实现以挂钩到数组语法。 PHP 有许多用于数组的内置函数,但它们只适用于内置...
本文以java中的容器为例,模拟Iterator的原理。 参考:马士兵 Java设计模式 Iterator 1.首先定义一个容器Collection接口. 2.定义一个Iterator迭代器的接口 3.定义一个ArrayList,实现Collection接口,并写一个实现了...
本文实例讲述了PHP迭代器接口Iterator用法。分享给大家供大家参考,具体如下: PHP Iterator接口的作用是允许对象以自己的方式迭代内部的数据,从而使它可以被循环访问,Iterator接口摘要如下: Iterator extends ...
JAVA中的Iterator的用法 详细讲解用法
集合遍历接口java.util.Iterator,Iterator接口也是Java集合中的一员,但它与Collection、Map接口有所不同,Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,...
介绍C++中Iterator的用法,很实用
java中Iterator迭代器讲解,基础数据对象。
一个运用Extjs,Struts2, json,iterator技术构建的iterator_jsonDemo2。iterator_jsonDemo1的链接:http://download.csdn.net/detail/cafebar123/8816409 运用了Extjs,Struts2, json,iterator技术, 将数据从...
本文实例讲述了ES6 Iterator接口和for…of循环用法。分享给大家供大家参考,具体如下: [removed] // 数组已经帮我们内置这个Iterator接口 let arr = ['hello','world']; let map = arr[Symbol.iterator](); // ...
其实它不是一个在PHP中可以使用的接口,内部类才可使用,它有一个用途就是检测一个类是否可以遍历。 if($class instanceof Traversable) { //foreach } 2.Iterator迭代器接口 接口摘要: Iterator extends ...
该文档是演示迭代器Iterator的使用方法和源代码,其中包括了Iterator的继承类的讲解和再Iterator中的两种方法
Boost Iterator_adaptor
一个iterator_jsonDemo. 1.通过iterable接口和iterator实现迭代输出。2.通过JSONArray实现输出(自带json相关jar包)。供参考。
java 中 Iterator 与Iterable的作用;java语言需要更多基础沉淀,扎扎实实,后面的各种项目都会如何天翼。进行更高阶的用法和一些框架的原理都离开最基础的东西,基础虽然枯燥,但是也很有乐趣。