詳解php8中注解的實(shí)際應(yīng)用
前言
學(xué)過(guò)java的同學(xué)應(yīng)該都知道注解的作用,但是在php中注解有什么用呢?我的理解就是美化代碼和便于維護(hù)一些類的設(shè)計(jì)。
說(shuō)明
我們先設(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ù)需求,不同的性別在頁(yè)面上呈現(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é)
以前總覺(jué)得php 語(yǔ)言開(kāi)發(fā)大型項(xiàng)目并不是很適合,但現(xiàn)在php8出來(lái)后,個(gè)人覺(jué)得php8越來(lái)越適合開(kāi)發(fā)大型項(xiàng)目,祝php越來(lái)越好,能夠再眾多的開(kāi)發(fā)語(yǔ)言中再次脫穎而出。php是世界上最好的語(yǔ)言~
到此這篇關(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-12php array_map使用自定義的函數(shù)處理數(shù)組中的每個(gè)值
這篇文章主要介紹了php array_map使用自定義的函數(shù)處理數(shù)組中的每個(gè)值的相關(guān)資料,需要的朋友可以參考下2016-10-10PHP中call_user_func_array回調(diào)函數(shù)的用法示例
這篇文章主要給大家介紹了PHP中call_user_func_array回調(diào)函數(shù)的用法,文中給出了詳細(xì)的示例代碼,相信對(duì)大家的理解和學(xué)習(xí)很有幫助,有需要的朋友們可以參考借鑒,下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2016-11-11PHP經(jīng)典設(shè)計(jì)模式之依賴注入定義與用法詳解
這篇文章主要介紹了PHP經(jīng)典設(shè)計(jì)模式之依賴注入,結(jié)合實(shí)例形式分析了php依賴注入的定義、原理與用法,需要的朋友可以參考下2019-05-05PHP中的數(shù)組處理函數(shù)實(shí)例總結(jié)
這篇文章主要介紹了PHP中的數(shù)組處理函數(shù),結(jié)合實(shí)例形式總結(jié)分析了常見(jiàn)的PHP數(shù)組處理函數(shù)功能,定義及使用技巧,代碼備有詳盡的注釋便于理解,需要的朋友可以參考下2016-01-01前后端分離和跨域問(wèn)題的詳細(xì)解決方案(CORS的原理)
前后端跨域問(wèn)題由瀏覽器同源策略而來(lái),下面這篇文章主要給大家介紹了關(guān)于前后端分離和跨域問(wèn)題的詳細(xì)解決方案,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02