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()
php表示私有变量的是,PHP 访问私有和受保护的成员变量相关推荐
- c 子类对象 访问父类对象受保护成员_06-JavaSe面向对象
一.static 1.它是一种修饰符 2.使用位置:它用来修饰成员变量和成员方法 static修饰成员变量,叫类变量: static修饰成员方法,叫类方法: 类成员=类变量+类方法 没有使用stati ...
- c# 不可访问 因为它受保护级别限制
最近开始学习c#,编了一个程序就发现问题,不可访问 因为它受保护级别限制: 具体如下: 程序: using System; using System.Collections.Generic; usin ...
- 为什么用const保护了成员变量,还要再定义一个mutable关键字来突破const的封锁线?
为什么用const保护了成员变量,还要再定义一个mutable关键字来突破const的封锁线? 保护类的成员变量不在成员函数中被修改,是为了保证模型的逻辑正确,通过用const关键字来避免在函数中错误 ...
- c 子类对象 访问父类对象受保护成员_看了这个,你就会搞对象了
今天我们来聊聊面向对象的一些事情. 什么是面向对象?简单的来讲,面向对象是一种程序设计的思想,一种分析和解决问题的方式.如果说世间每一个事物,都是一个独一无二的个体,那么这个个体就是一个对象--你的女 ...
- c 子类对象 访问父类对象受保护成员_面向对象三大特征: 继承
如果子类重写了父类的方法,子类对象又要使用父类的方法怎么办 继承 今日内容 所有的类都直接或者简洁的集成到了Object Object:祖宗类 概述 要定义的类属于已有类的一种时,可以将该类定义为已有 ...
- java成员变量垃圾回收_JAVA 对象被垃圾回收后其成员变量可用吗? | 学步园
我们知道JVM中一个对象实例超出作用域或无引用的时候会被垃圾回收,那么他被垃圾回收后,依赖其成员变量的其他实例是否还能正常使用呢?经过测试后发现即使一个实例被垃圾回收,如果他内部的数据被其他对象使用, ...
- c 子类对象 访问父类对象受保护成员_java面向对象总结
前言:文章参考<java疯狂讲义>进行总结和归纳,知识要进行输出才算真正的有用. 在java的世界里,一切皆为对象,类是对对象的抽象,来一个例子:Person类 public 有了类,就可 ...
- java静态代码块、静态方法、静态变量、构造代码块、普通代码块、成员变量执行顺序
package smartt.styy.auth.model.voRsp;public class Test {static {String test5="555";//局部变量t ...
- java include 传递对象_变量的值传递,地址引用(和对象成员变量、局部变量创建和初始化的内存机制)...
变量的值传递,地址引用(和对象成员变量.局部变量创建和初始化的内存机制) 变量的值传递,地址引用: 搞懂=含义,=即指向,看指向的内存块是否发生改变,还有是否是新内存块, 通过指向可以控制内存块的值. ...
最新文章
- 微信小程序云开发,使用阿里云短信服务,搜索员工生日定期发送短信。
- python第一周小测验_Python小测试
- 杜克大学和Facebook联手开发更好的光通信
- java.util.date的格式_java.util.Date格式将yyyy-mm-dd转换为mm-dd-yyyy
- 【PM模块】技术对象管理
- Access 的top和order by 的问题
- 分享一款最近比较火爆的宝石迷情游戏游戏源码安卓版
- DataTabel中关于ImpotRow的一点尝试
- ASP.NET MVC3书店--第五节 表单编辑(第二部分)(转)
- hdu 2048 神、上帝以及老天爷
- hdfs文件如何导出到服务器,[Hadoop] 如何将 HDFS 文件导出到 Windows文件系统
- c语言cin输入数组,C++基础:各种输入方法总结cin.get()、
- 信息学奥赛一本通 1026:空格分隔输出 | OpenJudge NOI 1.1 06
- SQL_EXEC_ID分析(转帖)
- ES6 class继承
- 微软Exchange Server 2010 SP1下载
- 8 下半部和推后执行的工作
- 买了两年CSDN年VIP,用着实在太爽
- Experimental Class Task 4-1: Pupil Calculator
- 369亿估值的AI市场下,中国AI学习者的野心与实力
热门文章
- PHP 结合 Boostrap 结合 js 实现学生列表删除编辑以及搜索功能(完结)
- java中List Set Map使用
- C语言笔试常考知识点
- SqlBulkCopy 批量复制数据到数据表
- 一道关于比赛胜负的Sql查询题目
- 初见 IsolatedStorage
- QC使用流程(1)之安装篇
- 【转】英文论文中“such as, for example, e.g., i.e., etc., et al. ”的用法分析
- .net数据绑定控件中的数据导出到Excel
- iOS开发之普通网络异步请求与文件下载方法