资讯专栏INFORMATION COLUMN

【PHP高级特性】之反射

luckyw / 2295人阅读

摘要:开始提供了完整的反射。有反射类和反射函数等,功能大同小异,这里主要以为列说明。什么是反射他是指在运行状态中,动态的获取类方法属性参数注释等信息和动态调用对象的方法的功能。

PHP5 开始提供了完整的反射API。有反射类(ReflectionClass)和反射函数(ReflectionFunction)等,功能大同小异,这里主要以ReflectionClass为列说明。

什么是反射
他是指PHP在运行状态中,动态的获取类、方法、属性、参数、注释等信息和动态调用对象的方法的功能。

有什么用
可以帮助我们构建复杂的,可扩的运用。比如自动加载插件,自动生成文档等

代码示例
该示例为一个通用API入口

HttpApi.php

namespace twinkleservicehttp;

class HttpApi
{
    private $class;

    public function __construct($class)
    {
        $this->class = $class;
    }

    public function parseRequest($method,$params = [])
    {
        $class = new ReflectionClass($this->class);
        $instance = $class->newInstanceArgs($params);
        $method = $class->getMethod($method);
        $args = [];
        foreach ($method->getParameters() as $param) {
            $name = $param->getName();
            if (isset($params[$name])) {
                $args[$name] = $params[$name];
            } else {
                try {
                    $args[$name] = $param->getDefaultValue();
                } catch (Exception $e) {
                    throw new RequestException(
                        "请求参数不合未能",
                        500
                    );
                }
            }
        }

        return [$instance,$method,$args];
    }
}

NotFoundService.php

namespace appservices;

use appaseService;

class NotFoundService extends Service
{
    public function error()
    {
        return $this->format(["status" => 1, "msg" => "请求不合法,请确认service和method是否存在"]);
    }
}

使用范例

$params = $_REQUEST;
$serviceName= isset($params["service"]) ? $params["service"] : "NotFound";
$methodName= isset($params["method"]) ? $params["method"] : "error";
$class = "appservices" . Str::ucWords($serviceName) . "Service";
list($instance, $method, $args) = (new HttpApi($class))->parseRequest($methodName, $params);
echo json_encode(($method->invokeArgs($instance, $args)));

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28148.html

相关文章

  • PHP高级特性-反射Reflection以及Factory工厂设计模式的结合使用[代码实例]

    摘要:反射提供给面向对象编程可以自省的能力,即反射。在简单工厂模式中,根据传递的参数来返回不同的类的实例简单工厂模式又称为静态工厂方法模式。也就是简单工厂模式工厂工厂类。PHP高级特性-反射以及工厂设计模式的结合使用 [结合 Laravel-Admin 代码实例讲解]利用反射来实现工厂模式的生产而无需创建特定的工厂类本文地址http://janrs.com/?p=833转载无需经过作者本人授权转载...

    番茄西红柿 评论0 收藏2637
  • 网站渗透DVWA存储型XSS

    摘要:使自己脚本在网站运行,造成一些列的危险后果。之前说的反射型和存储型的主要区别在于,存储型的执行脚本会存储在数据库,长期有效。而只是对信息做了验证,并不能阻止的漏洞。机制和昨天说的反射型一模一样。 本文由甲爪cpa联盟(www.jiazhua.com)整理编辑!转载请注明!环境是PHPWAMP,firefox(火狐没有xss过滤器)。环境和dvwa如果下载不方便可以评论留邮箱,看到会分享...

    TANKING 评论0 收藏0
  • php实现依赖注入(DI)和控制反转(IOC)

    摘要:工厂模式,依赖转移当然,实现控制反转的方法有几种。其实我们稍微改造一下这个类,你就明白,工厂类的真正意义和价值了。虽然如此,工厂模式依旧十分优秀,并且适用于绝大多数情况。 此篇文章转载自laravel-china,chongyi的文章https://laravel-china.org/top...原文地址: http://www.insp.top/learn-lar... ,转载务必保...

    tomato 评论0 收藏0
  • 深入理解控制反转(IoC)和依赖注入(DI)

    摘要:本文一大半内容都是通过举例来让读者去理解什么是控制反转和依赖注入,通过理解这些概念,来更加深入。这种由外部负责其依赖需求的行为,我们可以称其为控制反转。工厂模式,依赖转移当然,实现控制反转的方法有几种。 容器,字面上理解就是装东西的东西。常见的变量、对象属性等都可以算是容器。一个容器能够装什么,全部取决于你对该容器的定义。当然,有这样一种容器,它存放的不是文本、数值,而是对象、对象的描...

    HollisChuang 评论0 收藏0
  • PHP高级特性】ArrayAccess 接口

    摘要:提供了个常用的预定义接口,实现某些特定的能力。是啥如官方文档所述,它提供像访问数组一样访问对象的能力的接口。它提供了个接口我们实现这个接口,依次对应数组的读取,设置,操作。用上了它,可以让一个类即可以支持对象引用,也支持数组引用。 php提供了6个常用的预定义接口,实现某些特定的能力。其中最最常用的就是 ArrayAccess 了,像 Laravel 这种流行的框架都用到了它。 Arr...

    mrli2016 评论0 收藏0

发表评论

0条评论

luckyw

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<