登录  /  注册
博主信息
博文 10
粉丝 0
评论 5
访问量 24904
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
ReflectionMethod--关于一个类方法的反射
晏南风i
原创
3972人浏览过

        上一节我们在文章最后谈到了参数绑定,今天我们就来说下要实现他需要哪些知识储备,可以通过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举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学