博客列表 >ReflectionMethod--关于一个类方法的反射

ReflectionMethod--关于一个类方法的反射

晏南风i
晏南风i原创
2018年09月11日 20:27:324039浏览

        上一节我们在文章最后谈到了参数绑定,今天我们就来说下要实现他需要哪些知识储备,可以通过PHP内置类ReflectionMethod去完成 ,当然,首先我们得了解这个类是干什么的。

图片1.png

        我们看到官方对这个类的解释为关于一个类方法的详细信息,有趣的是他继承了一个ReflectionFunctionAbstract类并实现了一个Refletor接口。

        我们先去看看ReflectionFunctionAbstract这个类吧!

图片2.png

        这个类更多的是关于脚本运行时函数的信息。如获得函数名称、获得参数个数、获得参数,但是他是一个抽象类,必须由一个非抽象类实现它,才可以使用它里面的方法。

        再看看这个Reflector接口吧!

图片3.png

        这个接口可被任何反射类实现来约束他实现export方法。   

        所以最终我们罗列下ReflectionMethod应该具有的方法:

        1、他本身具有的方法

图片4.png

        2、继承自抽象类的方法图片5.png

        其中,在自己方法中实现了接口方的抽象方法。

图片6.png

        接下来我们用他真正的做一些事情吧!

一、ReflectionMethod::getNumberOfParameters(获取参数数目)

实例

<?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 对象
    $reflectMethodObj = $reflect->getConstructor();
    # 获得构造函数的参数个数
    echo '构造函数参数个数为'.$reflectMethodObj->getNumberOfParameters().'个';

    # getNumberOfParameters并不是ReflectionMethod自己原有的方法,而是继承自ReflectionFunctionAbstract,而得来的方法

?>

运行实例 »

二、ReflectionMethod::getParameters(ReflectionParameter 数组返回参数列表 )

实例

<?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 对象
    $reflectMethodObj = $reflect->getConstructor();
    $arr = $reflectMethodObj->getParameters();
    echo '<pre>';
    print_r($arr);

    # 这个时候我们想如果参数一个个能罗列出来,那么这里就可以自动获取了,我们修改这个类的构造
?>

运行实例 »

修改后的构造:

实例

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

        public function __construct($username, $age, $sex)
        {
            $this->username = $username;
            $this->age = $age;
            $this->sex = $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 对象
    $reflectMethodObj = $reflect->getConstructor();
    $arr = $reflectMethodObj->getParameters();
    echo '<pre>';
    print_r($arr);
?>

运行实例 »

        对这样的改造是不是感觉很熟悉呢,这正是在ReflectionClass中的实例化类时推荐的那种方式!从结果我们可以看出,他把我们的每个参数变成了ReflectionParameter类的对象,这样,我们又可以拿着ReflectionParameter对象这个资源或句柄来获得一些有用的信息咯!下节我们将去看看ReflectionParameter类的具体操作及用处!

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议