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

        上一节我们在文章最后谈到了参数绑定,今天我们就来说下要实现他需要哪些知识储备,可以通过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类的具体操作及用处!

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