您现在的位置:计算机技术学习网 > 技术中心 > WEB编程 > PHP >

php设计模式介绍之值对象模式

来源:互联网 责任编辑:栏目编辑 发表时间:2013-07-02 00:15 点击:

在所有的最简单的程序中,大多数对象都有一个标识,一个重要的商业应用对象,例如一个Customer或者一个SKU,有一个或者更多的属性---id,name,email地址,这样可以把它从同一个类的其他实例区分开来。此外,对象有一个恒定的标识:它是贯穿于整个应用程序的一个唯一的标识,对于程序员来说,”customer A”在任何地方就是”customer A”,并且只要你的程序在持续运行时"customer A"仍然是"customer A"。 但是一个对象不需要有一个标识。有些对象仅仅是为了描述其他对象的属性。

例如:通常用一个对象描述一个日期、一个数字或者货币。日期、整数或美元的类定义是都是便于使用的、快捷、便于封装的,并且方便进行拷贝,相互比较,甚至是创建。

从表面上看,这些描述简单的对象很容易被执行:它们的语句非常少,在构造类时无论是应用于Customer还是SKU都没有什么不同。这个想法似乎是正确的,但是所谓的"似乎正确"很容易产生一些bug。

请看下面的代码,这是一个关于以美元给员工发放工资的对象的定义和执行操作。多数情况下,它的运行是没有问题的。(这个类被命名为BadDollar,因为它还存在着bug)。考虑一下,看你是否能发现它的bug。

// PHP5

class BadDollar {

protected $amount;

public function __construct($amount=0) {

$this->amount = (float)$amount;

}

public function getAmount() {

return $this->amount;

}

public function add($dollar) {

$this->amount += $dollar->getAmount();

}

}

class Work {

protected $salary;public function __construct() {

$this->salary = new BadDollar(200);}

public function payDay() {

return $this->salary;

}

}

class Person {

public $wallet;

}

function testBadDollarWorking() {

$job = new Work;

$p1 = new Person;

$p2 = new Person;

$p1->wallet = $job->payDay();

$this->assertEqual(200, $p1->wallet->getAmount());

$p2->wallet = $job->payDay();

$this->assertEqual(200, $p2->wallet->getAmount());

$p1->wallet->add($job->payDay());

$this->assertEqual(400, $p1->wallet->getAmount());

//this is bad — actually 400

$this->assertEqual(200, $p2->wallet->getAmount());

//this is really bad — actually 400

$this->assertEqual(200, $job->payDay()->getAmount());

}
那么, bug是什么呢?如果不能上面的代码例子中直观地发现问题,这里有个提示:雇员对象$p1和对象$p2使用着同一个BadDollar对象实例。

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • PHP测试
  • 十天学会php之第六天
  • 几种显示数据的方法的比较
  • 使用xmlhttp为网站增加域名查询功能
  • PHP+MYSQL+Javascript数据库查询结果的动态显示
  • 查找数组中指定键名的值
  • 用redis实现跨服务器session
  • 用新浪微博接口发送图片微博失败的原因
  • smarty局部缓存技术[源码分析]
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1