当前位置:首页 > PHP教程 > php应用 > 列表

详解php8中注解的实际应用

发布:smiling 来源: PHP粉丝网  添加日期:2024-02-29 16:34:52 浏览: 评论:0 

学过java的同学应该都知道注解的作用,但是在php中注解有什么用呢?我的理解就是美化代码和便于维护一些类的设计。

说明

我们先设计一个类,声明人类的性别

  1. <?php 
  2. class Sex 
  3.     //男人 
  4.     const MAN = 1; 
  5.       
  6.     //女人 
  7.     const WIFE = 2; 
  8.  
  9.     //未知 
  10.     const UNKNOWN = 0; 

由上可知,我们分别设计了3个类型,0=>未知,1=>男人,2=>女人

现在,应业务需求,我给前端展示的内容不能显示数字(0,1,2),要展示汉字(未知,男人,女人),数据映射在后端完成。 结合php8引入了枚举的支持。那么我们重新设计如下

  1. <?php 
  2.  
  3. enum Sex : int 
  4.     //男人 
  5.     case MAN = 1; 
  6.       
  7.     //女人 
  8.     case WIFE = 2; 
  9.  
  10.     //未知 
  11.     case UNKNOWN = 0; 
  12.       
  13.     public function getDescription() : string 
  14.     { 
  15.         return match($this
  16.         { 
  17.             self::MAN   =>   '男人'
  18.             self::WIFE  =>  '女人'
  19.             self::UNKNOWN => '未知' 
  20.         }; 
  21.     } 
  22. echo Sex::MAN->getDescription(); //获得中文映射 

由上可知,是不是看着就简单了许多。

但是,还有更直观的显示,设计会稍微复杂一点,我们接着慢慢向下看。

我们先设计一个trait,此trait完成注解的反射。

  1. <?php 
  2. trait EnumFeature 
  3.      /** 
  4.       * 获取case 注解内容 
  5.       * @param string $class 注解类 
  6.       * @return null | Object 
  7.       */ 
  8.      protected function getTargetCaseReflectionAnnotation(string $class) : mixed 
  9.      { 
  10.         $reflection = new \ReflectionEnumBackedCase(self::class,$this->name); 
  11.  
  12.         $attributes = $reflection->getAttributes(); 
  13.         if(emptyempty($attributes)) 
  14.         { 
  15.             return null; 
  16.         } 
  17.  
  18.         foreach($attributes as $attribute
  19.         { 
  20.             if($attribute->getName() === $class
  21.             { 
  22.                 return $attribute->newInstance(); 
  23.             } 
  24.         } 
  25.  
  26.         return null; 
  27.      } 

在设计一个注解类,让这个注解类可以注解 enum - case

  1. <?php 
  2. #[\Attribute(\Attribute::TARGET_CLASS_CONSTANT)] 
  3. class CaseDescription 
  4.     public function __construct( 
  5.         public string $description 
  6.     ){} 

重构 enum 设计如下

  1. enum Sex : int 
  2.     use EnumFeature 
  3.       
  4.     #[CaseDescription('男人')] 
  5.     case MAN = 1; 
  6.       
  7.     #[CaseDescription('女人')] 
  8.     case WIFE = 2; 
  9.  
  10.     #[CaseDescription('未知')] 
  11.     case UNKNOWN = 0; 
  12.       
  13.     public function getDescription() : ?string 
  14.     { 
  15.         //获取注解示例,并从中获取 description 属性 
  16.         return $this->getTargetCaseReflectionAnnotation(CaseDescription::class)?->description; 
  17.     } 

这样看着是否直观了很多?对比之前的方案,也便于维护。

完整版,应业务需求,不同的性别在页面上呈现的性别颜色也不同。

再设计一个Color注解

  1. <?php 
  2.  
  3. #[\Attribute(\Attribute::TARGET_ALL)] 
  4. class Color 
  5.     public function __construct( 
  6.         public ?string $value = null 
  7.     ){} 

对性别进行color注解添加

  1. enum Sex : int 
  2.     use EnumFeature 
  3.       
  4.     #[CaseDescription('男人'),Color("#000000")] 
  5.     case MAN = 1; 
  6.       
  7.     #[CaseDescription('女人'),Color("#FFF000")] 
  8.     case WIFE = 2; 
  9.  
  10.     #[CaseDescription('未知'),Color("#CCCCCC")] 
  11.     case UNKNOWN = 0; 
  12.       
  13.     //获取中文名称 
  14.     public function getDescription() : ?string 
  15.     { 
  16.         //获取注解示例,并从中获取 description 属性 
  17.         return $this->getTargetCaseReflectionAnnotation(CaseDescription::class)?->description; 
  18.     } 
  19.       
  20.     //获取颜色 
  21.     public function getColort() : ?string 
  22.     { 
  23.         return $this->getTargetCaseReflectionAnnotation(Color::class)?->value; 
  24.     } 

以上就是我对注解的实际应用。当然再hyperf 框架中,注解实际上被赋予了更多的含义(如自动注入等高级功能,类似java的spring容器了)

总结

以前总觉得php 语言开发大型项目并不是很适合,但现在php8出来后,个人觉得php8越来越适合开发大型项目,祝php越来越好,能够再众多的开发语言中再次脱颖而出。php是世界上最好的语言~

Tags: php8实际应用

分享到: