七月
21
2016

通过反射类实现对类的 protected 和 private 属性及方法的测试

写在前面

在编写类(Class)的时候,部分方法及属性为了限制访问,会设置为 privateprotected 权限,尤其是对于类属性来说,为了安全方面的原因,多数是不允许直接访问的。

而在测试时,由于无法在外部直接访问,这样的设置会让测试变得很麻烦。

当然,所谓的麻烦,也就是在 Hy369 知道 ReflectionObject 相关的类之前的事,因为从麻烦变得简单了,所以 Hy369 的 PHP 博客中便有了这样一篇文章。

ReflectionObject 类

ReflectionObject 类可用于获取一个对象(Object)相关的信息,就像下面的代码这样:

class Iphp8Blog
{
    protected $name = "爱PHP吧,PHP博客";
    protected function getName()
    {
        return $this->name;
    }
}

$iphp8Blog = new Iphp8Blog();
$r = new ReflectionObject($iphp8Blog);

上面的代码,$r 变量便是对于 Iphp8Blog 实例的反射。至于该对象可以获取到哪些关于 Iphp8Blog 实例的信息,可以参考官方文档

ReflectionMethod 类

ReflectionMethod 类可用于获取一个方法相关的信息,该类是用于访问访问权限被限制为 protectedprivate 的方法的关键类。相关的例子如下:

class Iphp8Blog
{
    protected $name = "爱PHP吧,PHP博客";
    protected function getName()
    {
        return $this->name;
    }
}

$iphp8Blog = new Iphp8Blog();
$r = new ReflectionObject($iphp8Blog);
$m = $r->getMethod('getName');  // 这里返回的便是 ReflectionMethod 类的实例
$m->setAccessible(true);  // 让 getName() 方法可访问
$m->invoke($iphp8Blog);  // 执行 $iphp8Blog 中的 getName() 方法

通过上述例子,便实现了对访问权限为 protectedprivate 方法的访问。如果方法是带参数的,直接从 invoke() 方法的第二个参数开始逐个传递对应方法的参数即可,例如:$m->invoke($iphp8Blog, $arg1, $arg2, ...);,第一个参数,也就是 Iphp8Blog 的实例 $iphp8Blog 是必需的。

另外还有个 invokeArgs() 方法,与 invoke() 方法类似,只不过对应方法的参数是通过数组进行传递的,例如:$m->invoke($iphp8Blog, array($arg1, $arg2, ...));

更多可访问的信息参考官方文档

ReflectionProperty 类

ReflectionMethod 类可用于获取一个属性相关的信息,该类是用于访问访问权限被限制为 protectedprivate 的属性的关键类。相关示例如下:

class Iphp8Blog
{
    protected $name = "爱PHP吧,PHP博客";
    protected function getName()
    {
        return $this->name;
    }
}

$iphp8Blog = new Iphp8Blog();
$r = new ReflectionObject($iphp8Blog);
$m = $r->getProperty('name');  // 这里返回的便是 ReflectionProperty 类的实例
$m->setAccessible(true);  // 让 name 属性可访问
$m->getValue($iphp8Blog);  // 访问 $iphp8Blog 中的 name 属性

通过上述例子,便实现了对访问权限为 protectedprivate 属性的访问。

更多可访问的信息参考官方文档

非特殊注明博文为 爱PHP吧(www.iphp8.com)原创内容,转载请注明原文地址:http://www.iphp8.com/?post=101

评论

发表评论:

(选填)

(选填)