我是靠谱客的博主 朴实抽屉,最近开发中收集的这篇文章主要介绍使用反射调用 protected 或者 private 的类方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

如果想避免一个方法被外部可见或者子类可见,可以采用 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 的类方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部