快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门威尼人斯app平台:php设计模式介绍之迭代器模式



类中的面向工具编程封装利用逻辑。类,便是实例化的工具,每个零丁的工具都有一个特定的身份和 状态。零丁的工具是一种组织代码的有用措施,但平日你会处置惩罚一组工具或者聚拢。

属性来自 SQL 查询的一组数据便是一个聚拢,就像本书前面章节先容的 Monopoly 游戏示例的工具列表。

聚拢不必然是均一的。图形用户界面框架中的 Window 工具可以网络随意率性数量的节制工具 - Menu、 Slider 和 Button。并且,聚拢的实现可以有多种要领:PHP 数字是一个聚拢,但也是一个散列表,一 个链接列表,一个客栈以及行列步队。

问题

若何操纵随意率性的工具聚拢?

办理规划

应用迭代器模式来供给对聚拢内容的统一存取。

你可能没故意识到这一点,但你天天都 在应用迭代器模式 - 它潜藏在 PHP 的数组类型和各类数组操作函数中。(着实,给你一些固有类的数 组的组合和一群用这些固有类事情的可变函数,你将不得不应用这些数组来处置惩罚工具澳门威尼人斯app平台聚拢。这是在 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 数组的内部实现就与你不相 关了。迭代器结合了封装和多态的面向工具法度榜样设计道理。应用迭代器,你可以对聚拢中的工具进行操 作,而无需专门懂得聚拢若何显现或者聚拢包孕什么(工具的种类)。迭代澳门威尼人斯app平台器供给了不合固定迭代实现 的澳门威尼人斯app平台统一接口,它完全包孕了若何操纵特定聚拢的具体信息,包括显示哪些项(过滤)及其显示顺序(排序 )。

让我们创建一个简单的工具,在数组中对它进行操作。(只管该示例在 PHP5 情况下,但迭 代器并不特定于 PHP5。虽然添加了较多的引用操作符,本章节中的大年夜多半示例在 P澳门威尼人斯app平台HP4 下也能够运行) 。工具 Lendable 表示诸如片子、相册等媒体,它作为 Web 站点的一部分或办事,容许用户浏览或将他 们的媒体聚拢分享给其他用户。(对    于该示例,请无需斟酌其他方面。)让我们开始下面对 Lendable 根基设计的测试。

// PHP5

class LendableTestCase extends  UnitTestCase {

function TestCheckout() {

$item = new Lendable;

$this- >assertFalse($item->borrower);

$item->checkout(‘John’);

$this->assertEqual(‘borrowed’, $item->status);

$this- >assertEqual(‘John’, $item->borrower);

}

function  TestCheckin() {

$item = new Lendable;

$item->checkout (‘John’);

$item->checkin();

$this->assertEqual (‘library’, $item->status);

$this->assertFalse($item- >borrower);

}

}

要实现这一最初测试的需求,我们来创建一个带有多少 公共属性和一些措施的类,来触发这些属性的值:

class Lendable {

public  $status = ‘library’;

public $borrower = ‘’;

public  function checkout($borrower) {

$this->status = ‘borrowed’;

$this->borrower = $borrower;

}

public function c澳门威尼人斯app平台heckin() {

$this- >status = ‘library’;

$this->borrower = ‘’;

}

}

Lendable 是一个好的,通俗的起头。让我们将它扩展到诸如 DVD 或 CD 的磁道项。 媒体扩展了 Lendable,并且磁道具体记录了特定媒体的具体信息,包括项目的名称,宣布的年份以及项 本身的类型:

class Media extends Lendable {

public $name; public  $type; public $year;

public function __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 的测试用例。

class LibraryTestCase extends UnitTestCase {

function TestCount()  {

$lib = new Library;

$this->assertEqual(0, $lib->count());

}

}

它是满意这一测试的简单类:

class Library {

function  count() {

return 0;

}

}

继承将一些有趣的功能添加到测试中:

class LibraryTestCase extends UnitTestCase {

function TestCount() {  /* ... */ }

function TestAdd() {

$lib = new Library;

$lib->add (‘one’);

$this->assertEqual(1, $lib->count());

}

}

您可能还会对下面的文章感兴趣: