例如:通常用一个对象描述一个日期、一个数字或者货币。日期、整数或美元的类定义是都是便于使用的、快捷、便于封装的,并且方便进行拷贝,相互比较,甚至是创建。 从表面上看,这些描述简单的对象很容易被执行:它们的语句非常少,在构造类时无论是应用于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对象实例。 首先,类Work和类Person的实例已经创建。那么,假设每一个雇员最初有一个空的电子钱包,雇员的电子钱包Person:wallet是通过Work::payDay()函数返回的对象资源变量赋值的,所以被设定为一个BadDollar类的对象实例。 还记得PHP5的对象赋值处理方式吗?因为PHP5的对象赋值的处理方式,所以$job::salary,、$p1::wallet和$p2::wallet这三个看上去不同的对象实例虽然使用着不同的“标识符”,但是事实上,它们全部都指定到同一个对象实例。 因此,接下来的发放工资的操作(PayDay表示发放工资的日子,这里表示发放工资的动作),使用$job->payDay()本来仅仅是想增加$P1的工资,却出乎意料地次给$P2也发放了。并且,这个动作还改变了工作的基本工资的额度。因此,最后两个值的检测报错。 Value Object PHP5 Unit Test

1) Equal expectation fails because [Integer: 200] differs from [Float: 400] by 200

in testBadDollarWorking

in ValueObjTestCase

2) Equal expectation fails because [Integer: 200] differs from [Float: 400] by 200

in testBadDollarWorking

in ValueObjTestCase

FAILURES!!!

12345下一页阅读全文

php值对象模式场景,php设计模式介绍之值对象模式第1/5页相关推荐

  1. golang设计模式介绍(内含各个模式的java对比)代码解读

    golang设计模式介绍 设计模式是面向对象软件的经验,是通常设计问题的解决方案,每一种设计模式系统的命名,解释和评价了面向对象中一个重要的和重复出现的设计. 以下一一介绍这些设计模式 1.1工厂设计 ...

  2. java抽象工厂模式实例_Java设计模式百例 - 抽象工厂模式

    抽象工厂模式是在工厂方法模式之上的有一次升级,以便能够处理更加复杂的对象创建场景.因此也是所有形态的工厂模式中最为抽象和最具一般性的一种形态. 有朋友可能会想了,工厂方法模式已经是对简单工厂模式的具体 ...

  3. java蝇量模式_Head First设计模式——蝇量和解释器模式

    蝇量 蝇量模式:如果让某个类的一个实例能用来提供许多"虚拟实例",就使用蝇量模式. 在一个设计房子的平台中,周围要加上一些树,树有一个坐标XY坐标位置,而且可以根据树的年龄动态将自 ...

  4. 抽象工厂模式java_Java描述设计模式(04):抽象工厂模式

    一.抽象工厂模式 1.生活场景 汽车生产根据用户选择的汽车类型,指定不同的工厂进行生产,选择红旗轿车,就要使用中国工厂,选择奥迪轿车,就要使用德国工厂. 2.抽象工厂模式 1) 抽象工厂模式:定义了一 ...

  5. java外观模式实例_Java设计模式(11)----------外观模式

    1.介绍 外观模式是一种结构型设计模式.在外观模式中,外观类中提供一个或者一组对外的接口.客户端对于复杂系统的访问是通过外观类的接口进行的,从而解除了客户端与复杂系统之间的耦合,隐藏了复杂系统内部的逻 ...

  6. 23种设计模式介绍(一)---- 创建型模式

    由于设计模式篇幅比较大,如果在一篇文章讲完所有的设计模式的话不利于阅读.于是我把它分为三篇文章 23种设计模式介绍(一)---- 创建型模式 23种设计模式介绍(二)---- 结构型模式 23种设计模 ...

  7. sql中如何统计各种零件的总数量_如何应用GOF设计模式中的构建者模式创建复合对象实例...

    软件项目实训及课程设计指导--如何应用GOF设计模式中的构建者模式创建复合对象实例 1.GOF设计模式中的构建者模式 构建者设计模式能够将一个复杂对象(它一般为组合类)的构建过程与它的表示部件相互分离 ...

  8. 23种设计模式介绍以及在Java中的实现

    本文章出自:blog.csdn.net/anxpp/artic- 若要查看原文请点击 文章中的示例源码在github上:github.com/anxpp/JavaD- 由于CSDN上的下拉翻页比较麻烦 ...

  9. 设计模式学习笔记——迭代器(Iterator)模式

    设计模式学习笔记--迭代器(Iterator)模式 @(设计模式)[设计模式, 迭代器模式, iterator, 迭代器] 设计模式学习笔记迭代器Iterator模式 基本介绍 迭代器案例 类图 实现 ...

最新文章

  1. html2Escape js 转义
  2. Ubuntu 16.04 LTS 在anaconda环境下安装pytorch和tensorflow gpu,cuda10.0
  3. 软件的Express Edition是什么版?
  4. JAVAWEB开发之JSP、EL、及会话技术(Cookie和Session)的使用详解
  5. 2021年,朋友圈都在传这8个视频
  6. kafka专题:kafka的Topic主题、Partition分区、消费组偏移量offset等基本概念详解
  7. vue 计算属性和data_Vue.js教程(五)--Vue的计算属性
  8. ISIS 中 Level1-2路由器向本区域内Level-1邻居下发缺省路由
  9. 【物理应用】基于matlab粒子群配电网重构【含Matlab源码 764期】
  10. Nacos注册中心之服务实例心跳续约与实例过期下线源码解析
  11. java编程新手自学手册_Java Web编程新手自学手册
  12. 上海python数据分析_python数据分析实例(四) 上海餐饮店数据
  13. excel 如何将带杠的日期转换成不带杠的格式
  14. 轻松几步获得上万点击率(三)
  15. linux运行jar的几种方式
  16. tlp导致linux运行缓慢,通过TLP改善Linux中的电源使用 | MOS86
  17. VR全景开发学习链接Three.js
  18. SpringBoot:yaml配置及语法、yml数据读取、多环境开发控制
  19. 人工智能就业方向及前景,前景如何?好就业吗?
  20. EARTHDATA网站(modis数据下载流程),超级详细,附有火狐浏览器downthemall使用流程,以及默认路径修改方式

热门文章

  1. SpringSecurity 整合 JWT
  2. 小程序 获取用户信息 openid 等
  3. mysql 常用命令与备份恢复 整理
  4. 微信公众平台无法使用支付宝收付款的解决方案
  5. python3 装饰器参数_Learn Python 3:装饰器
  6. springMVC 后端代码 如何用 @requestParam() 接收前台传过来的数组
  7. 分布式队列编程:模型、实战
  8. java实现自动任务_Java实现定时任务的三种方法
  9. 136. Single Number
  10. OC Swift中UITextFiled、UITextView限制输入字数