class Food
{
    public $name = 'apple';

}

class Person
{
    const SEX = 'boy';
    public $name;
    private $age;
    protected $hobbies = [];

    public function eat(Food $foodObj, string $waterName):string
    {
        return "eatting {$foodObj->name},drinking {$waterName}";
    }

    public function hello()
    {
        return 'Hello world';
    }
}

$instance = (new ReflectionClass('Person'))->newInstance();
$reflectionMethod = new ReflectionMethod('Person', 'eat');

//校验成员方法是否是public,可访问的
if (!$reflectionMethod->isPublic()) {
    echo '不能访问Person类的eat方法' . PHP_EOL;
    return;
}

//ReflectionParametr对象组成的数组
$parameters = $reflectionMethod->getParameters();
if (empty($parameters)) {
    echo $reflectionMethod->invoke($instance);
} else {
    $args = [];
    foreach ($parameters as $parameterObj) {
        if ($reflectionclass = $parameterObj->getClass()) {
            $className = $reflectionclass->getName();
            $args[] = (new ReflectionClass($className))->newInstance();
        } else {
            $args[] = 'hello';
        }
    }
    echo $reflectionMethod->invoke($instance, ...$args);
}


  1. 实现ReflectionClass对象

  2. 实现ReflectionMethod对象

  3. 实现ReflectionParameter对象

  4. 通过反射实现对象的依赖注入