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

继续我们上一节的话题,我们在使用ReflectionMethod的getParameters方法后,返回了一个 ReflectionParamters类的对象。

接下来看看这个类的具体内容:

图片1.png


官方这里解释的非常详细:

首先这个类的功能:  他获得了函数或方法参数的详细信息。

其次,这个类并没有构造函数,因为一个关于参数的反射类,必须满足在他是参数或者方法前提下,抛开这两个范围,参数将无从谈起。所以,ReflectionParamter类的构造是由ReflectionMethod调用返回后生成的,而且他为每一个参数都生成了一个ReflectionParamter对象,这样就能获得每个参数的详细信息了。至于另一种构造ReflectionParamter的方法是使用RefelctionFunction这个是关于普通函数的一个反射类,后面我们会详细讲解。

那知道怎么构造这个类,我们看看他内部有哪些方法?

图片2.png

首先他实现了Reflector接口,这个接口之前遇到过,他也被ReflectionMethod类实现,那么在他本身的方法中,首先得实现这个接口的抽象方法。

图片3.png

除此之外是他的详细方法:

图片4.png

更多的是关于参数的详细信息:如,获得参数名称,获得参数类型,检查是否有默认值等等。

老规矩,知道这些基本信息后开始使用它们做一些事情:

一、ReflectionParamter::getName(获得参数名称)

实例

<?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();
    # 获得构造函数的参数列表 [数组对象方式]
    $params = $reflectMethodObj->getParameters();

    # 遍历数组对象并调用对象中的一些方法
    foreach($params as $param)
    {
        # 这里的param就是ReflectionParamter的对象

        # 获得了每个参数的变量名
        $paramName = $param->getName();
        echo $paramName.'<br>';
    }

?>

运行实例 »

这个例子展示了获得参数的参数名,那这个有什么用呢?我们在传参的时候是以数组形式传入,那数组有索引和关联数组,
索引比较好说,按着顺序排序后,一个萝卜了一个坑就可以绑定了,但是关联传参呢,和他绑定的是参数名,所以我们要获得参数的参数名

二、ReflectionParamter::getClass(获得类型提示)

实例

<?php

    class User
    {
        public     $username;
        protected  $age;
        private    $sex;

        public function __construct(Exception $class, array $array, Reflector $interface, callable $callback)
        {

        }

        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();
    # 获得构造函数的参数列表 [数组对象方式]
    $params = $reflectMethodObj->getParameters();

    # 遍历数组对象并调用对象中的一些方法
    foreach($params as $param)
    {
        # 这里的param就是ReflectionParamter的对象

        # 获得了每个参数类型提示类 (只获取提示类型为类的参数) 其余的返回NULL
        $class = $param->getClass();
        echo '<pre>';
        var_dump($class);
    }


?>

运行实例 »

PHP 5 起可以使用类型约束。函数的参数可以指定必须为对象(在函数原型里面指定类的名字),接口,数组(PHP 5.1 起)或者 callable(PHP 5.4 起)。不过如果使用 NULL 作为参数的默认值,那么在调用函数的时候依然可以使用 NULL 作为实参。而getClass方法可获取类型提示中的关于类的约束,按返回具有详细的命名空间的类名。

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