PHP基于SPL实现的迭代器模式示例
本文实例讲述了PHP基于SPL实现的迭代器模式。分享给大家供大家参考,具体如下:
现在有这么两个类,Department部门类、Employee员工类:
//部门类
classDepartment{
private$_name;
private$_employees;
function__construct($name){
$this->_name=$name;
$this->employees=array();
}
functionaddEmployee(Employee$e){
$this->_employees[]=$e;
echo"员工{$e->getName()}被分配到{$this->_name}中去";
}
}
//员工类
classEmployee{
private$_name;
function__construct($name){
$this->_name=$name;
}
functiongetName(){
return$this->_name;
}
}
//应用:
$lsgo=newDepartment('LSGO实验室');
$e1=newEmployee("小锦");
$e2=newEmployee("小猪");
$lsgo->addEmployee($e1);
$lsgo->addEmployee($e2);
好了,现在LSGO实验室已经有两个部员了,现在我想把全部的部员都列出来,就是用循环来获取部门的每个员工的详情。
在这里我们用PHP中的SPL标准库提供的迭代器来实现。
《大话设计模式》中如是说:
迭代器模式:迭代器模式是遍历集合的成熟模式,迭代器模式的关键是将遍历集合的任务交给一个叫做迭代器的对象,它的工作时遍历并选择序列中的对象,而客户端程序员不必知道或关心该集合序列底层的结构。
迭代器模式的作用简而言之:是使所有复杂数据结构的组件都可以使用循环来访问
假如我们的对象要实现迭代,我们使这个类实现Iterator(SPL标准库提供),这是一个迭代器接口,为了实现该接口,我们必须实现以下方法:
current(),该函数返回当前数据项
key(),该函数返回当前数据项的键或者该项在列表中的位置
next(),该函数使数据项的键或者位置前移
rewind(),该函数重置键值或者位置
valid(),该函数返回bool值,表明当前键或者位置是否指向数据值
实现了Iterator接口和规定的方法后,PHP就能够知道该类类型的对象需要迭代。
我们使用这种方式重构Department类:
classDepartmentimplementsIterator
{
private$_name;
private$_employees;
private$_position;//标志当前数组指针位置
function__construct($name)
{
$this->_name=$name;
$this->employees=array();
$this->_position=0;
}
functionaddEmployee(Employee$e)
{
$this->_employees[]=$e;
echo"员工{$e->getName()}被分配到{$this->_name}中去";
}
//实现Iterator接口要求实现的方法
functioncurrent()
{
return$this->_employees[$this->_position];
}
functionkey()
{
return$this->_position;
}
functionnext()
{
$this->_position++;
}
functionrewind()
{
$this->_position=0;
}
functionvalid()
{
returnisset($this->_employees[$this->_position]);
}
}
//Employee类同前
//应用:
$lsgo=newDepartment('LSGO实验室');
$e1=newEmployee("小锦");
$e2=newEmployee("小猪");
$lsgo->addEmployee($e1);
$lsgo->addEmployee($e2);
echo"LSGO实验室部员情况:";
//这里其实遍历的$_employee
foreach($lsgoas$val){
echo"部员{$val->getName()}";
}
附加:
假如现在我们想要知道该部门有几个员工,如果是数组的话,一个count()函数就ok了,那么我们能不能像上面那样把对象当作数组来处理?SPL标准库中提供了Countable接口供我们使用:
classDepartmentimplementsIterator,Countable{
//前面同上
//实现Countable中要求实现的方法
functioncount(){
returncount($this->_employees);
}
}
//应用:
echo"员工数量:";
echocount($lsgo);
本文参考自《深入理解PHP高级技巧、面向对象与核心技术》
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。