欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ReflectionClass--关于一个类的反射

程序员文章站 2022-03-01 18:16:20
...

一、 ReflectionClass::__construct(如何为一个类使用反射类[反射类的构造])

实例

<?php
    class User
    {
        public     $username;
        protected  $age;
        private    $sex;
    
        public function __construct($username, $age, $sex)
        {
    
        }
    
        public function getUsername()
        {
            return $this->username;
        }
    }
    
    # 为User类创建ReflectionClass类  参数可为包含类名的字符串 或者 类的对象
    $reflect = new ReflectionClass('User'); 
    # 返回初始化完成后的 ReflectionClass 实例。
    var_dump($reflect);
?>


运行实例 »

二、ReflectionClass::newInstance(使用反射类完成对象的创建[User实例的创建])

实例

<?php
    class User
    {
        public     $username;
        protected  $age;
        private    $sex;
    
        public function __construct($args)
        {
           $this->username = $args['username'];
           $this->age      = $args['age'];
           $this->sex      = $args['sex'];
        }
        
        public function getUsername()
        {
           return $this->username;
        }
    }
    
    # 为User类创建ReflectionClass类   参数可为包含类名的字符串 或者 类的对象
    $reflect = new ReflectionClass('User'); 
    # 使用反射类实例化User 接受可变数目的参数,用于传递到类的构造函数,和 call_user_func() 很相似。
    $user = $reflect->newInstance(['username'=>'jesse', 'age'=>21, 'sex'=>'man']); 
    # 使用返回User类的实例调用User类中的方法。
    echo $user->getUsername();
?>

运行实例 »

三、ReflectionClass::newInsance(另一种创建对象实例的方法[不推荐])

实例

<?php
    class User
    {
        public     $username;
        protected  $age;
        private    $sex;

        public function __construct($args)
        {
            $this->username = $args['username'];
            $this->age = $args['age'];
            $this->sex = $args['sex'];
        }

        public function getUsername()
        {
            return $this->username;
        }

        public function getAge()
        {
            return $this->age;
        }

        public function getSex()
        {
            return $this->sex;
        }
    }

    # 为 User类创建ReflectionClass 类
    $reflect = new ReflectionClass('User'); 
    # 使用反射类实例化User 接受可变数目的参数,用于传递到类的构造函数,和 call_user_func() 很相似。
    $user = $reflect->newInstance(['username'=>'jesse', 'age'=>21, 'sex'=>'man']); //参数为数组,将以 array 形式传递到类的构造函数
    # 返回User类的实例。
    echo $user->getAge();
 
    //Tip: 这里的参数数目为可变的,可为数组,字符串。构造内的值需要根据不同类型做出对应接受。个人喜欢数组直接传递方式。
        
?>

运行实例 »

以上展示如何使用一个反射类创建类的实例,按照惯例在new类名的同时需要传入构造的参数,来完成对类内部的属性初始化赋值操作。但是有个问题需要思考,一个类的构造参数往往具有不确定性,我们在反射类实例化之前可不可以自动获得需要实例化类的参数个数,并按着用户传入的值进行顺序绑定,最后完成反射类实例化操作,岂不美哉?所以,接下来我们需要将镜头转切至构造函数(方法)上面去:

四、ReflectionClass::getConstructor(获得方法详情的资源[或作句柄])

实例

<?php
    class User
    {
        public     $username;
        protected  $age;
        private    $sex;

        public function __construct($args)
        {
            $this->username = $args['username'];
            $this->age = $args['age'];
            $this->sex = $args['sex'];
        }

        public function getUsername()
        {
            return $this->username;
        }

        public function getAge()
        {
            return $this->age;
        }

        public function getSex()
        {
            return $this->sex;
        }
    }

    # 为 User类创建ReflectionClass 类
    $reflect = new ReflectionClass('User'); //参数可为包含类名的字符串 或者 类的对象
    # 获取已反射的类的构造函数 没有参数 返回一个 ReflectionMethod 对象
    $reflectMethod = $reflect->getConstructor();
    var_dump($reflectMethod);

?>

运行实例 »

在调用getConstructor方法后发现,他返回了一个RefalectionMethod对象,而RefalectionMethod类是PHP内置类,他除了为我们提供关于类方法的一些信息,如他的对外可访问性(public、protected、private),除此之外还支持动态调用执行一个方法(invoke),关于ReflectionMethod的详细信息我们将在下篇文章中详细讲解。