概述
如果想避免一个方法被外部可见或者子类可见,可以采用 protected 或者 private 关键字来修改这些类,但是我们有时候又想在外部调用这些方法,不一定要改成 public ,如果这是我们自己的代码,就可以这样做,但是如果是引入的外部代码的话,这就不太容易直接修改了。
现在,我们可以在外部使用 反射 来调用这些方法,现在我们来定义一个 Man 类
<?php
class Man
{
public function name()
{
return 'Man';
}
protected function age()
{
return 22;
}
private function weight()
{
return 100;
}
private static function eat()
{
return 1;
}
}
通常情况下,我们是没有办法直接调用 age 和 weight 方法的,现在,我们使用反射来调用。
$reflectionClass = new ReflectionClass('Man');
$ageMethod = $reflectionClass->getMethod('age'); // 获取 age 方法
$ageMethod->setAccessible(true); // 设置可见性
// 调用这个方法,需要传入对象作为上下文
$age = $ageMethod->invoke($reflectionClass->newInstance());
var_dump($age);// 22
还有一个更简单的办法:
$reflectionClass = new ReflectionClass('Man');
$weightMethod = $reflectionClass->getMethod('weight');// 获取 weight 方法
// 获取一个闭包,然后调用,同样需要传入对象作为上下文,后面调用的地方就可以传入参数
$weight = $weightMethod->getClosure($reflectionClass->newInstance())();
var_dump($weight);
调用静态方法
$reflectionClass = new ReflectionClass('Man');
$eatMethod = $reflectionClass->getMethod('eat');
$eatMethod->setAccessible(true);
$eat = $eatMethod->invoke(null); // 如果是一个静态方法,你可以传递一个 null
var_dump($eat);
参考:https://www.php.net/manual/zh/class.reflectionproperty.php
实例化一个类,可以用反射绕过构造方法(__construct)
class Dog
{
private $name;
public function __construct($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
}
$dogClass = new ReflectionClass('Dog');
// 创建一个新实例,但是不调用构造方法
$dogInstance = $dogClass->newInstanceWithoutConstructor();
var_dump($dogInstance->getName()); // null
最后
以上就是朴实抽屉为你收集整理的使用反射调用 protected 或者 private 的类方法的全部内容,希望文章能够帮你解决使用反射调用 protected 或者 private 的类方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复