詳解php8中注解的實(shí)際應(yīng)用
前言
學(xué)過java的同學(xué)應(yīng)該都知道注解的作用,但是在php中注解有什么用呢?我的理解就是美化代碼和便于維護(hù)一些類的設(shè)計(jì)。
說明
我們先設(shè)計(jì)一個(gè)類,聲明人類的性別
<?php
class Sex
{
//男人
const MAN = 1;
//女人
const WIFE = 2;
//未知
const UNKNOWN = 0;
}
由上可知,我們分別設(shè)計(jì)了3個(gè)類型,0=>未知,1=>男人,2=>女人
現(xiàn)在,應(yīng)業(yè)務(wù)需求,我給前端展示的內(nèi)容不能顯示數(shù)字(0,1,2),要展示漢字(未知,男人,女人),數(shù)據(jù)映射在后端完成。 結(jié)合php8引入了枚舉的支持。那么我們重新設(shè)計(jì)如下
<?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(); //獲得中文映射
由上可知,是不是看著就簡(jiǎn)單了許多。
但是,還有更直觀的顯示,設(shè)計(jì)會(huì)稍微復(fù)雜一點(diǎn),我們接著慢慢向下看。
我們先設(shè)計(jì)一個(gè)trait,此trait完成注解的反射。
<?php
trait EnumFeature
{
/**
* 獲取case 注解內(nèi)容
* @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;
}
}
在設(shè)計(jì)一個(gè)注解類,讓這個(gè)注解類可以注解 enum - case
<?php
#[\Attribute(\Attribute::TARGET_CLASS_CONSTANT)]
class CaseDescription
{
public function __construct(
public string $description
){}
}
重構(gòu) enum 設(shè)計(jì)如下
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;
}
}
這樣看著是否直觀了很多?對(duì)比之前的方案,也便于維護(hù)。
完整版,應(yīng)業(yè)務(wù)需求,不同的性別在頁面上呈現(xiàn)的性別顏色也不同。
再設(shè)計(jì)一個(gè)Color注解
<?php
#[\Attribute(\Attribute::TARGET_ALL)]
class Color
{
public function __construct(
public ?string $value = null
){}
}
對(duì)性別進(jìn)行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;
}
}
以上就是我對(duì)注解的實(shí)際應(yīng)用。當(dāng)然再hyperf 框架中,注解實(shí)際上被賦予了更多的含義(如自動(dòng)注入等高級(jí)功能,類似java的spring容器了)
總結(jié)
以前總覺得php 語言開發(fā)大型項(xiàng)目并不是很適合,但現(xiàn)在php8出來后,個(gè)人覺得php8越來越適合開發(fā)大型項(xiàng)目,祝php越來越好,能夠再眾多的開發(fā)語言中再次脫穎而出。php是世界上最好的語言~
到此這篇關(guān)于詳解php8中注解的實(shí)際應(yīng)用的文章就介紹到這了,更多相關(guān)php8注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PHP根據(jù)文章內(nèi)容生成關(guān)鍵詞自動(dòng)化Keywords標(biāo)簽
這篇文章主要為大家介紹了PHP根據(jù)文章內(nèi)容生成關(guān)鍵詞實(shí)現(xiàn)自動(dòng)化Keywords標(biāo)簽實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
php array_map使用自定義的函數(shù)處理數(shù)組中的每個(gè)值
這篇文章主要介紹了php array_map使用自定義的函數(shù)處理數(shù)組中的每個(gè)值的相關(guān)資料,需要的朋友可以參考下2016-10-10
PHP中call_user_func_array回調(diào)函數(shù)的用法示例
這篇文章主要給大家介紹了PHP中call_user_func_array回調(diào)函數(shù)的用法,文中給出了詳細(xì)的示例代碼,相信對(duì)大家的理解和學(xué)習(xí)很有幫助,有需要的朋友們可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。2016-11-11
PHP經(jīng)典設(shè)計(jì)模式之依賴注入定義與用法詳解
這篇文章主要介紹了PHP經(jīng)典設(shè)計(jì)模式之依賴注入,結(jié)合實(shí)例形式分析了php依賴注入的定義、原理與用法,需要的朋友可以參考下2019-05-05
PHP中的數(shù)組處理函數(shù)實(shí)例總結(jié)
這篇文章主要介紹了PHP中的數(shù)組處理函數(shù),結(jié)合實(shí)例形式總結(jié)分析了常見的PHP數(shù)組處理函數(shù)功能,定義及使用技巧,代碼備有詳盡的注釋便于理解,需要的朋友可以參考下2016-01-01
前后端分離和跨域問題的詳細(xì)解決方案(CORS的原理)
前后端跨域問題由瀏覽器同源策略而來,下面這篇文章主要給大家介紹了關(guān)于前后端分離和跨域問題的詳細(xì)解決方案,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02

