示例

反射通常用作软件测试的一部分,例如在运行时创建/实例化模拟对象。这对于在任何给定时间点检查对象的状态也非常有用。这是在单元测试中使用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()

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

  1. c 子类对象 访问父类对象受保护成员_06-JavaSe面向对象

    一.static 1.它是一种修饰符 2.使用位置:它用来修饰成员变量和成员方法 static修饰成员变量,叫类变量: static修饰成员方法,叫类方法: 类成员=类变量+类方法 没有使用stati ...

  2. c# 不可访问 因为它受保护级别限制

    最近开始学习c#,编了一个程序就发现问题,不可访问 因为它受保护级别限制: 具体如下: 程序: using System; using System.Collections.Generic; usin ...

  3. 为什么用const保护了成员变量,还要再定义一个mutable关键字来突破const的封锁线?

    为什么用const保护了成员变量,还要再定义一个mutable关键字来突破const的封锁线? 保护类的成员变量不在成员函数中被修改,是为了保证模型的逻辑正确,通过用const关键字来避免在函数中错误 ...

  4. c 子类对象 访问父类对象受保护成员_看了这个,你就会搞对象了

    今天我们来聊聊面向对象的一些事情. 什么是面向对象?简单的来讲,面向对象是一种程序设计的思想,一种分析和解决问题的方式.如果说世间每一个事物,都是一个独一无二的个体,那么这个个体就是一个对象--你的女 ...

  5. c 子类对象 访问父类对象受保护成员_面向对象三大特征: 继承

    如果子类重写了父类的方法,子类对象又要使用父类的方法怎么办 继承 今日内容 所有的类都直接或者简洁的集成到了Object Object:祖宗类 概述 要定义的类属于已有类的一种时,可以将该类定义为已有 ...

  6. java成员变量垃圾回收_JAVA 对象被垃圾回收后其成员变量可用吗? | 学步园

    我们知道JVM中一个对象实例超出作用域或无引用的时候会被垃圾回收,那么他被垃圾回收后,依赖其成员变量的其他实例是否还能正常使用呢?经过测试后发现即使一个实例被垃圾回收,如果他内部的数据被其他对象使用, ...

  7. c 子类对象 访问父类对象受保护成员_java面向对象总结

    前言:文章参考<java疯狂讲义>进行总结和归纳,知识要进行输出才算真正的有用. 在java的世界里,一切皆为对象,类是对对象的抽象,来一个例子:Person类 public 有了类,就可 ...

  8. java静态代码块、静态方法、静态变量、构造代码块、普通代码块、成员变量执行顺序

    package smartt.styy.auth.model.voRsp;public class Test {static {String test5="555";//局部变量t ...

  9. java include 传递对象_变量的值传递,地址引用(和对象成员变量、局部变量创建和初始化的内存机制)...

    变量的值传递,地址引用(和对象成员变量.局部变量创建和初始化的内存机制) 变量的值传递,地址引用: 搞懂=含义,=即指向,看指向的内存块是否发生改变,还有是否是新内存块, 通过指向可以控制内存块的值. ...

最新文章

  1. 微信小程序云开发,使用阿里云短信服务,搜索员工生日定期发送短信。
  2. python第一周小测验_Python小测试
  3. 杜克大学和Facebook联手开发更好的光通信
  4. java.util.date的格式_java.util.Date格式将yyyy-mm-dd转换为mm-dd-yyyy
  5. 【PM模块】技术对象管理
  6. Access 的top和order by 的问题
  7. 分享一款最近比较火爆的宝石迷情游戏游戏源码安卓版
  8. DataTabel中关于ImpotRow的一点尝试
  9. ASP.NET MVC3书店--第五节 表单编辑(第二部分)(转)
  10. hdu 2048 神、上帝以及老天爷
  11. hdfs文件如何导出到服务器,[Hadoop] 如何将 HDFS 文件导出到 Windows文件系统
  12. c语言cin输入数组,C++基础:各种输入方法总结cin.get()、
  13. 信息学奥赛一本通 1026:空格分隔输出 | OpenJudge NOI 1.1 06
  14. SQL_EXEC_ID分析(转帖)
  15. ES6 class继承
  16. 微软Exchange Server 2010 SP1下载
  17. 8 下半部和推后执行的工作
  18. 买了两年CSDN年VIP,用着实在太爽
  19. Experimental Class Task 4-1: Pupil Calculator
  20. 369亿估值的AI市场下,中国AI学习者的野心与实力

热门文章

  1. PHP 结合 Boostrap 结合 js 实现学生列表删除编辑以及搜索功能(完结)
  2. java中List Set Map使用
  3. C语言笔试常考知识点
  4. SqlBulkCopy 批量复制数据到数据表
  5. 一道关于比赛胜负的Sql查询题目
  6. 初见 IsolatedStorage
  7. QC使用流程(1)之安装篇
  8. 【转】英文论文中“such as, for example, e.g., i.e., etc., et al. ”的用法分析
  9. .net数据绑定控件中的数据导出到Excel
  10. iOS开发之普通网络异步请求与文件下载方法