PHP基于SPL实现的迭代器模式示例
php  /  管理员 发布于 7年前   181
本文实例讲述了PHP基于SPL实现的迭代器模式。分享给大家供大家参考,具体如下: 现在有这么两个类,Department部门类、Employee员工类: 好了,现在LSGO实验室已经有两个部员了,现在我想把全部的部员都列出来,就是用循环来获取部门的每个员工的详情。 在这里我们用PHP中的SPL标准库提供的迭代器来实现。 《大话设计模式》中如是说: 迭代器模式:迭代器模式是遍历集合的成熟模式,迭代器模式的关键是将遍历集合的任务交给一个叫做迭代器的对象,它的工作时遍历并选择序列中的对象,而客户端程序员不必知道或关心该集合序列底层的结构。 迭代器模式的作用简而言之:是使所有复杂数据结构的组件都可以使用循环来访问 假如我们的对象要实现迭代,我们使这个类实现 Iterator(SPL标准库提供),这是一个迭代器接口,为了实现该接口,我们必须实现以下方法: 实现了 Iterator 接口和规定的方法后,PHP就能够知道该类类型的对象需要迭代。 我们使用这种方式重构 Department 类: 附加: 假如现在我们想要知道该部门有几个员工,如果是数组的话,一个 本文参考自《深入理解PHP高级技巧、面向对象与核心技术》 更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》 希望本文所述对大家PHP程序设计有所帮助。//部门类class Department{ private $_name; private $_employees; function __construct($name){ $this->_name = $name; $this->employees = array(); } function addEmployee(Employee $e){ $this->_employees[] = $e; echo "员工{$e->getName()}被分配到{$this->_name}中去"; }}//员工类class Employee{ private $_name; function __construct($name){ $this->_name = $name; } function getName(){ return $this->_name; }}//应用:$lsgo = new Department('LSGO实验室');$e1 = new Employee("小锦");$e2 = new Employee("小猪");$lsgo->addEmployee($e1);$lsgo->addEmployee($e2);
current()
,该函数返回当前数据项key()
,该函数返回当前数据项的键或者该项在列表中的位置next()
,该函数使数据项的键或者位置前移rewind()
,该函数重置键值或者位置valid()
,该函数返回 bool 值,表明当前键或者位置是否指向数据值class Department implements Iterator{ private $_name; private $_employees; private $_position;//标志当前数组指针位置 function __construct($name) { $this->_name = $name; $this->employees = array(); $this->_position = 0; } function addEmployee(Employee $e) { $this->_employees[] = $e; echo "员工{$e->getName()}被分配到{$this->_name}中去"; } //实现 Iterator 接口要求实现的方法 function current() { return $this->_employees[$this->_position]; } function key() { return $this->_position; } function next() { $this->_position++; } function rewind() { $this->_position = 0; } function valid() { return isset($this->_employees[$this->_position]); }}//Employee 类同前//应用:$lsgo = new Department('LSGO实验室');$e1 = new Employee("小锦");$e2 = new Employee("小猪");$lsgo->addEmployee($e1);$lsgo->addEmployee($e2);echo "LSGO实验室部员情况:";//这里其实遍历的$_employeeforeach($lsgo as $val){ echo "部员{$val->getName()}";}
count()
函数就 ok 了,那么我们能不能像上面那样把对象当作数组来处理?SPL标准库中提供了 Countable 接口供我们使用:class Department implements Iterator,Countable{ //前面同上 //实现Countable中要求实现的方法 function count(){ return count($this->_employees); }}//应用:echo "员工数量:";echo count($lsgo);
您可能感兴趣的文章:
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号