php 8 注解的实际应用
前言
学过java的同学应该都知道注解的作用,但是在php中注解有什么用呢?我的理解就是美化代码和便于维护一些类的设计。
说明
我们先设计一个类,声明人类的性别
<?php
class Sex
{//男人const MAN = 1;//女人const WIFE = 2;//未知const UNKNOWN = 0;
}
由上可知,我们分别设计了3个类型,0=>未知,1=>男人,2=>女人
现在,应业务需求,我给前端展示的内容不能显示数字(0,1,2),要展示汉字(未知,男人,女人),数据映射在后端完成。 结合php8引入了枚举的支持。那么我们重新设计如下
<?phpenum 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是世界上最好的语言~
相关文章:
php 8 注解的实际应用
前言 学过java的同学应该都知道注解的作用,但是在php中注解有什么用呢?我的理解就是美化代码和便于维护一些类的设计。 说明 我们先设计一个类,声明人类的性别 <?php class Sex {//男人const MAN 1;//女人const WIFE 2;//未知const…...
【数据结构】树与二叉树(十三):递归复制二叉树(算法CopyTree)
文章目录 5.2.1 二叉树二叉树性质引理5.1:二叉树中层数为i的结点至多有 2 i 2^i 2i个,其中 i ≥ 0 i \geq 0 i≥0。引理5.2:高度为k的二叉树中至多有 2 k 1 − 1 2^{k1}-1 2k1−1个结点,其中 k ≥ 0 k \geq 0 k≥0。引理5.3&…...
相机突然断电,保存的DAT视频文件如何打开
3-6 本文主要解决因相机突然断电导致拍摄的视频文件打不开的问题。 在平常使用相机拍摄视频,比如使用佳能相机拍摄视频的时候,如果电池突然断电,就非常有可能会导致视频没来得及保存而损坏的情况,比如会产生下图中的这种DAT文件…...
[西湖论剑 2022]real_ez_node
文章目录 前置知识EJS模板注入(CVE-2022-29078)原型链污染漏洞 (CVE-2021-25928)HTTP响应拆分攻击(CRLF) 解题过程代码审计构造payload 前置知识 EJS模板注入(CVE-2022-29078) EJS…...
如何正确使用GPT工具
引言 在快速发展的数字时代,人工智能(AI)已成为科研领域的一个不可或缺的工具。特别是像ChatGPT这样的AI聊天机器人,它通过高效的语言模型和深度学习算法,为科研工作者提供了前所未有的辅助。从文献搜索到数据分析&…...
Kotlin Multiplatform稳定版本发布:加速跨平台开发的新里程碑
Kotlin Multiplatform稳定版本发布:加速跨平台开发的新里程碑 引言 在最新的消息中,JetBrains团队宣布Kotlin Multiplatform(KMP)将于2023年10月稳定发布。这一消息对于广大开发者来说毫无疑问是一个令人振奋的消息。KMP的正式生…...
Paas-云管理
云管理平台(Cloud Management Platform,CMP)是由Gartner最先提出的企业云战略中的一种产品形态。Gartner对云管理平台(CMP)的定义是一种管理公有云、私有云和混合云环境的整合性产品。 什么是云管理平台 云管理平台&a…...
http-server安装使用
前段时间给电脑重装了系统,很多东西都没了,今天想在浏览器打开一个本地的html文件,发现电脑上没有http-server,于是装了一个,并且记录下安装过程 1、安装 nodejs,但如果你电脑上有,就无需下载 …...
【CSDN 每日一练 ★☆☆】【位运算】只出现一次的数字
【CSDN 每日一练 ★☆☆】【位运算】只出现一次的数字 题目 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实…...
Spring的注入
目录 一、Spring的概念 二、各种数据类型的注入 (1)studentService (2)applicationContext.xml(Sring核心配置文件) (3)测试 三、注入null或者empty类型的数据 (1…...
Linux-Docker的基础命令和部署code-server
1.安装docker 1.安装需要的安装包 yum install -y yum-utils2.设置镜像仓库 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo3.安装docker yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin do…...
微信小程序授权登陆 getUserProfile
目录 前言 步骤: 示例代码: 获取用户信息的接口变化历史: 注意事项: 前言 在微信小程序中,你可以使用 getUserProfile 接口来获取用户的个人信息,并进行授权登录。以下是使用 getUserProfile 的步骤: 小程序发了…...
深度学习AI识别人脸年龄
以下链接来自 落痕的寒假 GitHub - luohenyueji/OpenCV-Practical-Exercise: OpenCV practical exercise GitHub - luohenyueji/OpenCV-Practical-Exercise: OpenCV practical exercise import cv2 as cv import time import argparsedef getFaceBox(net, frame, conf_thresh…...
兔队线段树维护后缀非严格递增子序列的哈希值:CCPC2023深圳K
https://vjudge.net/contest/594134#problem/K 场上想到如果两个序列的后缀非严格递增子序列相同则平局,但不知道怎么维护 发现不用输出谁赢,只用判断是否平局,所以肯定是判断两个东西是否相等 然后如果单纯维护后缀非严格递增子序列&#…...
Django框架FAQ
文章目录 问题1:Django数据库恢复问题2:null和blank的区别3.报错 django.db.utils.IntegrityError: (1062, “Duplicate entry ‘‘ for key ‘mobile‘“)4.报错 Refused to display ‘url‘ in a frame because it set ‘X-Frame-Options‘ to deny5.报错 RuntimeError: cryp…...
chinese-hanfu-sd1.5-v30 训练日记
chinese-hanfu-sd1.5-v30 训练日记 训练数据: found directory /dataset/train_dataset2/chinese-hanfu-sd1-v30/img/10_ohxm woman contains 2465 image files found directory /dataset/train_dataset2/chinese-hanfu-sd1-v30/img/10_khs woman contains 8220 im…...
【Redis系列】Redis的核心命令(上)
哈喽,大家好,我是小浪。那么上篇博客教会了大家如何在Linux上安装Redis,那么本篇博客就要正式开始学习Redis啦,跟着俺的随笔往下看~ 1、启动Redis 那么如何启动Redis呢?最常用的是以下这个命令: redis-cl…...
鸿蒙 API9 接入 Crypto库
鸿蒙 API9 接入 Crypto库 开发环境 API9。 参考文档 之前研究了半天鸿蒙自身支持的算法库,只能说集成起来还是比较麻烦的,不如开箱即用的npm crypto好用。不过之前也没想到三方库会这么快的适配鸿蒙,毕竟小程序都多少年了,各种…...
Halcon WPF 开发学习笔记(2):Halcon导出c#脚本和WPF初步开发
文章目录 前言HalconC#教学简单说明如何二开机器视觉如何二次开发Halcon导出Halcon脚本新建WPF项目,导入Halcon脚本和Halcon命名空间 前言 我目前搜了一下我了解的机器视觉软件,有如下特点 优点缺点兼容性教学视频(B站前三播放量)OpenCV开源࿰…...
红队专题-从零开始VC++C/S远程控制软件RAT-MFC-超级终端
红队专题 招募六边形战士队员[16]超级终端(1) 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 [16]超级终端(1) 服务端 — 本地打开cmd — 接收命令 — 执行 — 发送回显 客户端 — 远端发送命令 — 接收回显 发送开启cmd命令 --- 接受…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
