当前位置: 代码网 > it编程>编程语言>Php > 详解php8中注解的实际应用

详解php8中注解的实际应用

2024年05月18日 Php 我要评论
前言学过java的同学应该都知道注解的作用,但是在php中注解有什么用呢?我的理解就是美化代码和便于维护一些类的设计。说明我们先设计一个类,声明人类的性别<?phpclass sex{//男人c

前言

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

说明

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

<?php
class sex
{
	//男人
	const man = 1;
	
	//女人
	const wife = 2;

	//未知
	const unknown = 0;
}

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

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

<?php

enum sex : int
{
	//男人
	case man = 1;
	
	//女人
	case wife = 2;

	//未知
	case unknown = 0;
	
	public function getdescription() : string
	{
		return match($this)
		{
			self::man	=>	'男人',
			self::wife  =>  '女人',
			self::unknown => '未知'
		};
	}
}
echo sex::man->getdescription(); //获得中文映射

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

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

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

<?php
trait enumfeature
{
	 /**
	  * 获取case 注解内容
	  * @param string $class 注解类
      * @return null | object
	  */
	 protected function gettargetcasereflectionannotation(string $class) : mixed
     {
        $reflection = new \reflectionenumbackedcase(self::class,$this->name);

        $attributes = $reflection->getattributes();
        if(empty($attributes))
        {
            return null;
        }

        foreach($attributes as $attribute)
        {
            if($attribute->getname() === $class)
            {
                return $attribute->newinstance();
            }
        }

        return null;
     }
}

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

<?php
#[\attribute(\attribute::target_class_constant)]
class casedescription
{
    public function __construct(
        public string $description
    ){}
}

重构 enum 设计如下

enum sex : int
{
	use enumfeature
	
	#[casedescription('男人')]
	case man = 1;
	
	#[casedescription('女人')]
	case wife = 2;

	#[casedescription('未知')]
	case unknown = 0;
	
	public function getdescription() : ?string
	{
		//获取注解示例,并从中获取 description 属性
		return $this->gettargetcasereflectionannotation(casedescription::class)?->description;
	}
}

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

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

再设计一个color注解

<?php

#[\attribute(\attribute::target_all)]
class color
{
    public function __construct(
        public ?string $value = null
    ){}
}

对性别进行color注解添加

enum sex : int
{
	use enumfeature
	
	#[casedescription('男人'),color("#000000")]
	case man = 1;
	
	#[casedescription('女人'),color("#fff000")]
	case wife = 2;

	#[casedescription('未知'),color("#cccccc")]
	case unknown = 0;
	
	//获取中文名称
	public function getdescription() : ?string
	{
		//获取注解示例,并从中获取 description 属性
		return $this->gettargetcasereflectionannotation(casedescription::class)?->description;
	}
	
	//获取颜色
	public function getcolort() : ?string
	{
		return $this->gettargetcasereflectionannotation(color::class)?->value;
	}
}

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

总结

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

到此这篇关于详解php8中注解的实际应用的文章就介绍到这了,更多相关php8注解内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com