设为首页 收藏本站
查看: 551|回复: 0

[经验分享] PHP中的Iterator、ArrayAccess、Countable接口

[复制链接]

尚未签到

发表于 2017-4-1 09:37:57 | 显示全部楼层 |阅读模式
使用接口(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 ";
}
?>

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-358460-1-1.html 上篇帖子: PHP 之编程初体验(二) 下篇帖子: php&.net对称压缩解压缩探讨
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表