Blogger Information
Blog 10
fans 0
comment 5
visits 25329
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
ReflectionClass--关于一个类的反射
晏南风i
Original
3160 people have browsed it

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

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post