如果想避免一个方法被外部可见或者子类可见,可以采用 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
还有一个更简单的办法: