php 通过反射实现类的私有方法、保护类型方法访问
没有你想不到,只有你做不到……
class Benz extends Car
{
private $customProp = "自定义属性";
...
private function customMethod()
{
echo "Call custom prop \$customProp: " . $this->customProp . PHP_EOL;
echo "This is a custom method in Benz Class" . PHP_EOL;
}
}
如果直接这样访问的话
(new Benz())->customMethod();
会报错,因为customMethod 方法是 私有方法,外部不能直接这样方法
那有什么办法可以实现访问呢
// 通过反射调用非 public 方法
$method = new ReflectionMethod(Benz::class, 'customMethod');
$method->setAccessible(true);
$benz = new Benz();
$method->invoke($benz);
通过反射,我们可以在运行时以逆向工程的方式对 PHP 类进行实例化,并对类中的属性和方法进行动态调用,不管这些属性和方法是否对外公开,所以这是一个黑科技。