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

例如:通常用一个对象描述一个日期、一个数字或者货币。日期、整数或美元的类定义是都是便于使用的、快捷、便于封装的,并且方便进行拷贝,相互比较,甚至是创建。 从表面上看,这些描述简单的对象很容易被执行:它们的语句非常少,在构造类时无论是应用于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下一页阅读全文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430519.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5月17日 AJAX 之 XML

主页面&#xff1a; <head> <script src"../jquery-2.2.3.min.js"></script> </head><body> <select id"sel"></select> </body> <script type"text/javascript"> $(document).ready(fun…

oracle 修改字段长度 用时,Oracle修改字段长度以及计算天数

sql修改字段长度的语法&#xff1a;alter table 表名 modify 字段名 字段类型;sql修改字段长度的示例代码alter table qtline modify qtl_bidernote VARCHAR2(4000);标准SQL&#xff0c;对任何数据库都适用alter table fzrtmis.reporttemplate modify REPNAME varchar(100)&…

(1-1)文件结构的升级(Area和Filter知识总结) - ASP.NET从MVC5升级到MVC6

ASP.NET从MVC5升级到MVC6 总目录 MVC5项目结构 带有Areas和Filter的项目结构 一般来说&#xff0c;小的MVC项目是不考虑领域的&#xff0c;但是&#xff0c;如果是稍微复杂一点的项目&#xff0c;往往是需要领域这个概念的。 一个领域就是一个小型的MVC项目&#xff0c;所以领域…

oracle数据库存储结构语句,oracle基本语句(第五章、数据库逻辑存储结构管理)...

1、使用SYS用户以SYSDBA身份登录到SQL Plus&#xff0c;使用视图V$TABLESPACE查看表空间信息SELECT * FROM V$TABLESPACE;2、查看视图DBA_TABLESPACES查看所有表空间的属性和在线状态SELECT TABLESPACE_NAME, CONTENTS, STATUSFROMDBA_TABLESPACES;--表空间名&#xff0c;表空间…

重启模块与及关开邮件存储设置功能页面-PHP-shell-py

邮件系统几百台&#xff0c;每台负责 grep -P "^ip\d.\d." /home/mymail/newconf/hosts.conf -c465 每台机器负责启动的模块又是不一样的如&#xff1a; A机器&#xff1a; ProgramsList"1svr,2svr,3svr,4svr," b机器&#xff1a; ProgramsList"asvr,…

oracle 表达式1000,oracle环境下占用编号的方法报语法错误:ORA-01795: 列表中的最大表达式数为 1000...

oracle 环境下&#xff0c;调用方法NumberCodeGenerateManager.OcuppyModelNumberCodesAfterSaved(ObjectID, modelID, ds)进行编号占用。当DataSet的数据行数〉1000时&#xff0c;会报语法错误&#xff1a;ORA-01795: 列表中的最大表达式数为 1000。跟踪语句如下&#xff1a;u…

奋斗路上的励志

当初看蜘蛛侠印象最深的一句台词就是“你是怎么样的人取决于你选择做什么样的人”。 昨天的你&#xff0c;你不可能完全忘记&#xff0c;但是你知道你曾经有多可耻卑微&#xff0c;重要的是你要做什么样的人&#xff0c;明天你会是什么样的你&#xff0c;重在做好现在的你。 坚…

用IIS配置反向代理

https://natapp.cn/ http://blog.csdn.net/g2321514568/article/details/12406755 目标服务器&#xff1a;targetServer 配置反向代理的服务器&#xff1a;reveseProxServer 1、确定最终访问的网址&#xff1a;比如www.baidu.com 、www.csdn.net等等。 当然你也可以自己在targ…

oracle存储过程使用ftp,ASM存储FTP上传文件

引用SQL>execute dbms_xdb.sethttpport(8080);SQL>execute dbms_xdb.setftpport(2100);SQL>commit;检查端口是否开启引用SQL> select dbms_xdb.GETHTTPPORT() from dual;DBMS_XDB.GETHTTPPORT()----------------------8080SQL> select dbms_xdb.GETFTPPORT() fr…

Python学习笔记——基础篇【第六周】——hashlib模块

常用模块之hashlib模块  用于加密相关的操作&#xff0c;3.x里代替了md5模块和sha模块&#xff0c;主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 &#xff0c;MD5 算法 import md5 hash md5.new() hash.update(admin) print hash.hexdigest() MD5-废弃import shahash sha…

oracle数据库领域,菜鸟成长课程之《Oracle数据库职业直通车》,引领大家真正进入Oracle数据库领域...

课程简介&#xff1a;近年来&#xff0c;Oracle数据库无疑是全球数据库领域中的领航者&#xff0c; Oracle DBA的待遇节节攀升&#xff0c; 导致了许多人希望转入这个行业。而Oracle数据库又因它的庞大和复杂另很多人望而却步&#xff0c;找不到入门的捷径。本课程是专门为在校…

虚拟存储

为解决日益增长的内存需要&#xff0c;有以下几种解决办法&#xff1a; 1.覆盖&#xff1a; 将程序划分成几个模块&#xff0c;将没有调用关系的模块&#xff08;即不会同时运行的模块&#xff09;分成一组&#xff0c;其中每组所占的内存大小为组内所需内存最大的模块的内存&a…

oracle 12542,TNS-12542: TNS:address already in use

研发说无法访问数据库&#xff0c;数据库正常运行&#xff0c;那就可能是监听有问题&#xff0c;一波简单操作搞定。[oracleentegor-1 ~]$ lsnrctl startLSNRCTL for Linux: Version 11.2.0.4.0 - Production on 17-AUG-2018 09:04:01Copyright (c) 1991, 2013, Oracle. All ri…

作为前端应当了解的Web缓存知识

缓存优点 通常所说的Web缓存指的是可以自动保存常见http请求副本的http设备。对于前端开发者来说&#xff0c;浏览器充当了重要角色。除此外常见的还有各种各样的代理服务器也可以做缓存。当Web请求到达缓存时&#xff0c;缓存从本地副本中提取这个副本内容而不需要经过服务器。…

怎么恢复oracle的包,【学习笔记】使用dbms_backup_restore包恢复数据库

天萃荷净使用dbms_backup_restore包恢复数据库Oracle提供了一个包:DBMS_BACKUP_RESTORE包是由dbmsbkrs.sql 和 prvtbkrs.plb 这两个脚本创建的.catproc.sql 脚本运行后会调用这两个包.所以是每个数据库都有的这个包是Oracle服务器和操作系统之间IO操作的接口.由恢复管理器直接调…

No module named 'urllib2'

import urllib2 response urllib2.urlopen(http://www.baidu.com/) html response.read() print html 报错 import urllib2ImportError: No module named urllib2 import urllib.request respurllib.request.urlopen(http://www.baidu.com) htmlresp.read() print(h…

oracle负数怎么比较大小,输出负数【oracle学习吧】_百度贴吧

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼题目&#xff1a;哪些选项输出一个负数&#xff1f;如果你确信以下都不对&#xff0c;那么请选E[sql]A DECLAREl_date2 DATE : date 2012-12-20;l_date1 DATE : l_date2 - 1;BEGINDBMS_OUTPUT.put_line (MONTHS_BETWEEN (l_date1, …

文件属性操作

//文件类型 &#xff1a;文件 file 文件夹(目录) dir两种 //1.获取文件类型 filetype("路径"); //如果是文件返回file 如果是目录返回dir//2.判断文件类型 is_dir("路径"); //判断给定的路径是不是目录is_file("路径"); //判断给定的路…

linux 提取日志字段,记一次Linux下提取MySQL日志关键字段

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;环境说明操作系统&#xff1a;centos7sed版本&#xff1a;4.2.2egrep版本&#xff1a;2.20paste版本&#xff1a;8.22提取要求一次同事说&#xff0c;需要提取MySQ…

linux 那些事儿之我是 u 盘,《Linux那些事儿之我是USB》.PDF

《Linux 那些事儿之我是 USB》作者&#xff1a;华清远见第 1 章 Linux 那些事儿之我是 USB Core专业始于专注 卓识源于远见1 &#xff0e;引子老夫子们痛心疾首地总结说&#xff0c;现代青年的写照是——自负太高&#xff0c;反对太多&#xff0c;商议太久&#xff0c;行动太迟…