晏南风i 2018-09-21 17:18:00 2826次浏览 0条评论 0 0 0

一、 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的详细信息我们将在下篇文章中详细讲解。

    没有找到数据。
您需要登录后才可以评论。登录 | 立即注册