通过反射来访问类的私有属性或者调用类的私有方法

一般来说类的私有属性和私有方法只能在类的内部进行使用,但是我们可以通过反射类在类的外部进行使用私有属性和私有方法

class Test {
    private $str = 'this is private property;';
    private function play()
    {
        return 'this is private function;';
    }    
}

// 获取反射类及反射属性
$class = new \ReflectionClass(Test::class);
// 获取Test类的私有方法play
$method = $class->getMethod("play");
// 设置方法可访问
$method->setAccessible(true);
// 获取Test类的私有属性$str
$property = $class->getProperty('str');
// 设置属性可访问
$property->setAccessible(true);
// 获取Test类的实例
$foo = new Test();
// 获取对象属性值
// 注意:只能通过 ReflectionProperty 实例的 getValue 方法访问
// 不能这样直接访问: $foo->bar;
echo $property->getValue($foo);
// 获取对象的方法
echo $method->invoke($foo);

 

posted @ 2021-10-16 10:33  风哀伤  阅读(287)  评论(0编辑  收藏  举报