php教程:php设计模式介绍之迭代器模式_PHP技巧_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

php教程:php设计模式介绍之迭代器模式

作者:黑客防线网安PHP教程基地 来源:黑客防线网安PHP教程基地 浏览次数:0

本篇关键词:模式介绍教程集合
黑客防线网安网讯:  类中的面向对象编程封装应用逻辑。类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态。单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合。    属...
  类中的面向对象编程封装应用逻辑就是实例化的对象每个单独的对象都有一个特定的身份和状态单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合。
  
  属性来自SQL查询的一组数据就是一个集合,就像本书前面章节介绍的Monopoly游戏示例的对象列表。
  
  集合不一定是均一的。图形用户界面框架中的Window对象可以收集任意数量的控制对象-Menu、Slider和Button。并且,集合的实现可以有多种方式:PHP数字是一个集合,但也是一个散列表,一个链接列表,一个堆栈以及队列。
  
  问题
  
  如何操纵任意的对象集合?
  
  解决方案
  
  使用迭代器模式来提供对集合内容的统一存取。
  
  你可能没有意识到这一点,但你每天都在使用迭代器模式-它潜藏在PHP的数组类型和各种数组操作函数中。(其实,给你一些固有类的数组的组合和一群用这些固有类工作的可变函数,你将不得不使用这些数组来处理对象集合。这是在PHP中的本地数组迭代:
  
  $test=array(‘one’,‘two’,‘three’);
  
  $output=‘’;reset($test);
  
  do{
  
  $output.=current($test);
  
  }while(next($test));
  
  echo$output;//produces‘onetwothree’
  
  reset()函数将迭代重新转到数组的开始;current()返回当前元素的值;next()则前进至数组中的下一个元素并返回新的current()值。当你超出数组的最后一个元素时,next()返回false。使用这些迭代方法,PHP数组的内部实现就与你不相关了。迭代器结合了封装和多态的面向对象程序设计原理。使用迭代器,你可以对集合中的对象进行操作,而无需专门了解集合如何显现或者集合包含什么(对象的种类)。迭代器提供了不同固定迭代实现的统一接口,它完全包含了如何操纵特定集合的详细信息,包括显示哪些项(过滤)及其显示顺序(排序)。
  
  让我们创建一个简单的对象,在数组中对它进行操作。(尽管该示例在PHP5环境下,但迭代器并不特定于PHP5。虽然添加了较多的引用操作符,本章节中的大多数示例在PHP4下也能够运行)。对象Lendable表示诸如电影、相册等媒体,它作为web站点的一部分或服务,允许用户浏览或将他们的媒体集合分享给其他用户。(对于该示例,请无需考虑其他方面。)让我们开始下面对Lendable基础设计的测试。
  
  //PHP5
  
  classLendableTestCaseextendsUnitTestCase{
  
  functionTestCheckout(){
  
  $item=newLendable;
  
  $this->assertFalse($item->borrower);
  
  $item->checkout(‘John’);
  
  $this->assertEqual(‘borrowed’,$item->status);
  
  $this->assertEqual(‘John’,$item->borrower);
  
  }
  
  functionTestCheckin(){
  
  $item=newLendable;
  
  $item->checkout(‘John’);
  
  $item->checkin();
  
  $this->assertEqual(‘library’,$item->status);
  
  $this->assertFalse($item->borrower);
  
  }
  
  }
  
  要实现这一最初测试的需求,我们来创建一个带有若干公共属性和一些方法的类,来触发这些属性的值:
  
  classLendable{
  
  public$status=‘library’;
  
  public$borrower=‘’;
  
  publicfunctioncheckout($borrower){
  
  $this->status=‘borrowed’;
  
  $this->borrower=$borrower;
  
  }
  
  publicfunctioncheckin(){
  
  $this->status=‘library’;
  
  $this->borrower=‘’;
  
  }
  
  }
  
  Lendable是一个好的,普通的开端。让我们将它扩展到诸如DVD或CD的磁道项。媒体扩展了Lendable,并且磁道详细记录了特定媒体的详细信息,包括项目的名称,发布的年份以及项本身的类型:
  
  classMediaextendsLendable{
  
  public$name;public$type;public$year;
  
  publicfunction__construct($name,$year,$type=’dvd’){
  
  $this->name=$name;
  
  $this->type=$type;
  
  $this->year=(int)$year;
  
  }
  
  }
  
  要使事情更加简单,媒体有三个公共的实例变量,Media::name,Media::year和Media::type。构造函数采用了两个参数,将第一个存储在$name中,第二个存储在$year中。构造函数还允许可选的第三个参数来指定类型(缺省为dvd)。
  
  给定单独的对象来操作,你现在可以创建一个容器来包含他们:Library。类似于常用的库,Library应该能够添加,删除和计算集合中的项。甚至,Library还应该允许访问集合(本章中的样本代码部分可看到示例)中的单一的项(对象)。
  
  我们开始构建Library的测试用例。
  
  classLibraryTestCaseextendsUnitTestCase{
  
  functionTestCount(){
  
  $lib=newLibrary;
  
  $this->assertEqual(0,$lib->count());
  
  }
  
  }
  
  它是满足这一测试的简单类:
  
  classLibrary{
  
  functioncount(){
  
  return0;
  
  }
  
  }
  
  继续将一些有趣的功能添加到测试中:
  
  classLibraryTestCaseextendsUnitTestCase{
  
  functionTestCount(){/*...*/}
  
  functionTestAdd(){
  
  $lib=newLibrary;
  
  $lib->add(‘one’);
  
  $this->assertEqual(1,$lib->count());
  
  }
  
  }
  
  实现add()的简单方法是建立在PHP灵活数组函数的基础上:你可以将项添加到实例变量并使用count()来返回集合众项的数量。
  
  classLibrary{
  
  protected$collection=array();
  
  functioncount(){
  
  returncount($this->collection);
  
  }
  
  functionadd($item){
  
  $this->collection[]=$item;
  
  }
  
  }
  
  Library现在是一个集合,但它没有提供检索或操纵单一数组成员的方法。
  
  
    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-17422-1.html
网站维护教程更新时间:2012-09-21 05:18:37  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer