zoukankan      html  css  js  c++  java
  • Swoole实战之手撸HttpServer框架 5 注解 doctrine/annotations

    https://www.bilibili.com/video/BV14E411t7T4?p=6

    1 通过反射获取注释的简单使用案例

    新建一个anntest文件夹

    composer init

    index.php

    <?php
    require_once __DIR__.'/vendor/autoload.php';
    
    /**
     * Class mytest
     * 我的注释
     */
    class mytest
    {
        
    }
    
    $c = new ReflectionClass(mytest::class);
    echo $c->getDocComment();

     会打印出类的注释

    2 使用第三方组件

    2.1 部署

    composer require doctrine/annotations 1.6

     文档 https://blog.csdn.net/anhe0516/article/details/101188650

    自动加载

    \composer.json

        "autoload": {
            "psr-4": {
                "App\\" : "app/"
    
            }
        },
        "require": {
            "doctrine/annotations": "1.6"
        }

    执行

    composer dump-autoload

     2.2 代码

    D:\seckill\anntest\app\annotations\Value.php

    namespace App\annotations;
    
    /**
     * @Annotation
     */
    class Value
    {
       public $name;
    }

    D:\seckill\anntest\app\test\MyRedis.php

    class MyRedis
    { 
        /**
         * @Value(name="url")
         */
         public $conn_url;
    
         
    }

    D:\seckill\anntest\index.php

    <?php
    require_once __DIR__.'/vendor/autoload.php';
    
    use \Doctrine\Common\Annotations\AnnotationReader;
    use \Doctrine\Common\Annotations\AnnotationRegistry;
    use \App\test\MyRedis;
    use \App\annotations\Value;
    
    
    //注册注释
    AnnotationRegistry::registerLoader('class_exists'); //回调需返回true
    //AnnotationRegistry::registerAutoloadNamespace("App\annotations");
    //AnnotationRegistry::registerFile(__DIR__ . '/app/annotations/Value.php'); //注册文件
    
    
    
    //获取反射对象 MyRedis
    $rc = new ReflectionClass(MyRedis::class);
    //获取反射对象的变量
    $p = $rc->getProperty("conn_url");
    
    $reader = new AnnotationReader();
    //获取变量的注释中@Value的name
    $anno = $reader->getPropertyAnnotation($p,Value::class);
    echo $anno->name;

    运行后成功获取注释信息

     3 利用注解动态读取配置文件

    3.1 代码部署

    3.1.1 配置文件 \.env

    url = 127.0.0.1:8080

    3.2.2 类的加载器 \app\core\ClassFactory.php

    <?php
    /**
     * 类的加载器
     */
    
    namespace App\core;
    
    
    use Doctrine\Common\Annotations\AnnotationReader;
    
    class ClassFactory
    {
         public static function loadClass($className)
         {
             $refClass = new \ReflectionClass($className);
             //return $refClass->newInstance();
             //获取所有的属性集合
             $properties = $refClass->getProperties();
             foreach ($properties as $property){
                 $read = new AnnotationReader();
                 $annos = $read->getPropertyAnnotations($property);
                 foreach ($annos as $anno){
                     //var_dump($anno);
                     $getValue =  $anno->do();
                     //实例化
                     $obj  =  $refClass->newInstance();
                     //给属性赋值
                     $property->setValue($obj,$getValue);
                     return $obj;
                 }
             }
             return false;
             
         }
    }
    View Code

    3.2.3 业务类 \app\test\MyRedis.php

    <?php
    
    
    namespace App\test;
    use App\annotations\Value;
    
    
    class MyRedis
    { 
        /**
         * @Value(name="url")
         */
         public $conn_url;
    
         
    }
    View Code

    3.2.4 注释类 \app\annotations\Value.php

    <?php
    namespace App\annotations;
    
    /**
     * @Annotation
     */
    class Value
    {
       public $name;
       public function do()
       {
           //return $this->name;
           $env = parse_ini_file('./.env');
           if(isset($env[$this->name])){
               return $env[$this->name];
           }
           return  false;
       }
    }
    View Code

    3.2 测试

    成功动态加载的实例

     4 注解类型

    CLASS 类的注解

    PROPERTY 属性

    METHOD 方法

    ALL 所有

    ANNOTATION 注释的嵌套

  • 相关阅读:
    (转)Javascript的DOM操作
    (转)关于 Java 对象序列化您不知道的 5 件事
    java计算某个日期是什么节气(24节气)
    HTML5 客户端存储数据的两种方式
    laytpl : 一款非常轻量的JavaScript模板引擎
    解决阿里云服务器3306端口无法访问的问题(windows server 2008r2)
    阿里云服务器windows server2008r2+tomcat8.0+nginx1.12
    使用log4j2打印Log,log4j不能打印日志信息,log4j2不能打印日志信息,log4j和logj2,idea控制台信息乱码(文末)
    Android 实现http通信(servlet做服务器端) HttpClient、HttpURLConnection实现登录验证
    windows查看端口占用、结束进程
  • 原文地址:https://www.cnblogs.com/polax/p/15547158.html
Copyright © 2011-2022 走看看