php表示私有变量的是,PHP 访问私有和受保护的成员变量

示例

反射通常用作软件测试的一部分,例如在运行时创建/实例化模拟对象。这对于在任何给定时间点检查对象的状态也非常有用。这是在单元测试中使用Reflection来验证受保护的类成员是否包含期望值的示例。

下面是一个非常基础的汽车课。它具有受保护的成员变量,该变量将包含代表汽车颜色的值。由于成员变量受保护,因此我们无法直接访问它,而必须使用getter和setter方法分别检索和设置其值。

class Car

{

protected $color

public function setColor($color)

{

$this->color = $color;

}

public function getColor($color)

{

return $this->color;

}

}

为了测试这一点,许多开发人员将创建一个Car对象,使用设置汽车的颜色,使用检索颜色,并将该值与他们设置的颜色进行比较:Car::setColor()Car::getColor()

/**

* @test

* @covers     \Car::setColor

*/

public function testSetColor()

{

$color = 'Red';

$car = new \Car();

$car->setColor($color);

$getColor = $car->getColor();

$this->assertEquals($color, $reflectionColor);

}

从表面上看,这似乎还可以。毕竟,所有要做的就是返回protected成员变量的值。但是此测试在两个方面存在缺陷:Car::getColor()Car::$color它执行的测试不在此测试范围内Car::getColor()

这取决于哪个错误本身可能使测试具有错误的肯定或否定。Car::getColor()

让我们看看为什么不应该在单元测试中使用,而应该使用Reflection。假设开发人员被分配了一项任务,以向每种汽车颜色添加“金属”。因此,他们尝试修改,以在汽车的颜色前添加“金属”:Car::getColor()Car::getColor()

class Car

{

protected $color

public function setColor($color)

{

$this->color = $color;

}

public function getColor($color)

{

return "Metallic "; $this->color;

}

}

看到错误了吗?开发人员使用分号代替串联运算符,以使“ Metallic”成为汽车的颜色。结果,无论汽车的实际颜色是什么,只要被调用,都会返回“ Metallic”。结果,即使工作得很好并且不受此更改的影响,我们的单元测试也将失败。Car::getColor()Car::setColor()Car::setColor()

那么,如何验证Car::$color包含通过设置的值?我们可以使用Refelection直接检查受保护的成员变量。那么我们该怎么做呢?我们可以使用Refelection使受保护的成员变量可被我们的代码访问,以便它可以检索值。Car::setColor()

让我们先看一下代码,然后将其分解:

/**

* @test

* @covers     \Car::setColor

*/

public function testSetColor()

{

$color = 'Red';

$car = new \Car();

$car->setColor($color);

$reflectionOfCar = new \ReflectionObject($car);

$protectedColor = $reflectionOfForm->getProperty('color');

$protectedColor->setAccessible(true);

$reflectionColor = $protectedColor->getValue($car);

$this->assertEquals($color, $reflectionColor);

}

这是我们使用Reflection获取Car::$color上面代码中的value的方式:我们创建一个新的ReflectionObject代表我们的Car对象

我们得到一个ReflectionProperty用于Car::$color(此“代表”Car::$color变量)

我们使Car::$color无障碍

我们得到的价值 Car::$color

如您所见,通过使用Reflection,我们可以得到的价值,Car::$color而不必调用可能导致无效测试结果的任何访问器函数。现在,我们的单元测试安全且准确。Car::getColor()Car::setColor()

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

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

相关文章

BZOJ2683 简单题(CDQ分治)

传送门 之前听别人说CDQ分治不难学,今天才知道果真如此。之前一直为自己想不到CDQ的方法二很不爽,今天终于是想出来了一道了,太弱…… cdq分治主要就是把整段区间分成两半,然后用左区间的值去更新右区间的答案,每次把…

VS2010断点设置技巧

*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com *************************************************** 许多Visual Studio下的程序员,甚至一些很有经验的开发人员,都不…

IOS应用开发版本控制工具之Versions使用,iosversions

Versions版本控制工具破解版(Versions.zip)下载请见本博文附件。下载后在MAC安装完以后,图标是莲花状。见下图: 双击运行如下图: 点击Repository,连接SVN服务器Repository(服务器端采用的是SVN服…

php form action跳转,form表单页面跳转方式提交练习

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼//form表单提交练习/*新建一个form.html网页用来书写前端HTML表单*/表单提交练习姓名:年龄:电话:地址:QQ:自我评价://以上功能可自己添加或修改/*在form.html网页的基础上新建一个foms.php网页关联之前的form.html网页并书写php测试…

VS2010调试快捷键

*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com *************************************************** vs2010 调试快捷键 命令名 快捷键 说明 调试.应用代码更改 Alt F10 启动生…

什么是算法,什么是数据结构

尽管已经学了几年,对它们也可以说大致懂得。但是,作为非计算机专业的人员,还是不会比计算机专业人员懂得多。既然没有受过专门的学习训练,自然会有三天打鱼两天晒网的感觉,一天可能冒出一个念头。于是乎,写…

如何在多web服务器共享SESSION数据

2019独角兽企业重金招聘Python工程师标准>>> 一、问题起源 稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站,用户系统是统一的&#xff0…

grpc php 返回值过大,使用grpc实现php、java、go三方互调

grpc作为经典的rpc协议,虽然略重,但是是有学习的价值的通过下面的内容可以快速上手这个grpc框架安装命令行工具php需要这个额外的protoc、grpc_php_plugin工具把这个protobuf格式的文件生成php语言里的类go需要安装protoc-gen-go工具把protobuf格式的接口…

SOCKET通信的基本步骤

SOCKET通信的基本步骤 1)建立一个服务器ServerSocket,并同时定义好ServerSocket的监听端口;2)ServerSocket 调用accept()方法,使之处于阻塞。3)创建一个客户机Socket,并设置好服务器的IP和端口。4&#xff…

Linux epoll 笔记(高并发事件处理机制)

wiki: Epoll优点; Epoll工作流程; Epoll实现机制: epollevent; Epoll源码分析; Epoll接口: epoll_create; epoll_ctl; epoll_close; Epoll工作方式: LT(level-triggered); ET(edge-triggered); Epoll应用模式; Epoll优点&#xff…

Django请求响应对象

请求与响应对象 HttpRequest HttpRequest存储了客户请求的相关参数和一些查询方法。 path请求页面的全路径,不包括域名—例如, "/hello/"。 methodHttp请求方法,包括GET,POST。 GETQueryDict类实例,包含所有HTTP GET参数的字典对象。 POSTQuer…

matlab 作图 虚线太长,matlab 极坐标绘图 在matlab中,用polar画的图形,如何使虚线圆多显示几个?...

满意答案iredwood推荐于 2018.12.26采纳率:52% 等级:12已帮助:13535人打开polar.m 文件,路径可通过输入 which polar 命令得到。其中修改下面这段代码,可以控制虚线圆的显示个数。其中rticks 为控制显示个数的参量。…

《学习opencv》笔记——矩阵和图像处理——cvAnd、cvAndS、cvAvg and cvAvgSdv

矩阵和图像的操作 (1)cvAnd函数 其结构 void cvAnd( //将src1和src2按像素点取“位与运算”const CvArr* src1,//第一个矩阵const CvArr* src2,//第二个矩阵CvArr* dst,//结果矩阵const CvArr* mask NULL;//矩阵经行像素点与的“开关” );程序实例#include <cv.h> #inc…

Hibernate之加载策略(延迟加载与即时加载)和抓取策略(fetch)

假设现在有Book和Category两张表,表的关系为双向的一对多,表结构如下: 假设现在我想查询id为2的那本书的书名,使用session.get(...)方法: 1 Session sessionHibernateUtil.getSession(); 2 Book book (Book) session.get(Book.class,2); 3 System.out.println(book.getName());…

指纹图像方向图matlab,matlab指纹方向场方向图程序

function Fangxiangtu zhiwen_fangxiangtu( Zhiwentuxiang )%函数功能计算指纹方向图%函数参数指纹图像Zhiwentuxiang%函数返回值指纹方向图FangxiangtuSizeZhiwentuxiang size( Zhiwentuxiang ) ;Zhiwentuxiang double( Zhiwentuxiang ) ;W 4; % 窗口大小(2W1)*(2W1)W 4;…

怎样实现一个简单的jQuery编程

第一步&#xff1a;在head中载入jQuery框架 <script  type"text/javascript" src"jQuery文档所在的绝对路径"></script> 注&#xff1a; type——指定脚本的mime类型 src——规定外部脚本文件的URL jQuery是一个javascript库&#xff0c;相…

php多人点餐可以看到对方点的菜,千万不要小看你身边那个会点菜的人,因为

饭局上&#xff0c;你常常是负责点菜的那个人&#xff0c;还是只负责吃&#xff1f;拿起菜单点菜&#xff0c;你是很从容&#xff0c;还是不知道怎么点&#xff1f;事实上&#xff0c;饭局上那个会点菜的人&#xff0c;千万不能小看。某次随老板外出开会&#xff0c;跟去的几个…

gvim for php,转 : Gvim建立IDE编程环境 (Windows篇)

说明&#xff1a;本文是作者在完全按照著名的《手把手教你把Vim改装成一个IDE编程环境》一文&#xff0c;在Windows XP上用gvim建立IDE环境时所作的备忘。原作地址&#xff1a;http://blog.csdn.net/wooin/archive/2007/10/31/1858917.aspx。1.安装gvim7.2。运行gvim72.exe&…

1081. Rational Sum (20) -最大公约数

题目如下&#xff1a; Given N rational numbers in the form "numerator/denominator", you are supposed to calculate their sum. Input Specification: Each input file contains one test case. Each case starts with a positive integer N (<100), followe…

CRC8校验分析

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** CRC即循环冗余校验码&#xff08;Cyclic Redundancy Check&#xff09;&#xff1a;是…