詳解php8中注解的實際應(yīng)用
前言
學(xué)過java的同學(xué)應(yīng)該都知道注解的作用,但是在php中注解有什么用呢?我的理解就是美化代碼和便于維護一些類的設(shè)計。
說明
我們先設(shè)計一個類,聲明人類的性別
<?php
class Sex
{
//男人
const MAN = 1;
//女人
const WIFE = 2;
//未知
const UNKNOWN = 0;
}
由上可知,我們分別設(shè)計了3個類型,0=>未知,1=>男人,2=>女人
現(xiàn)在,應(yīng)業(yè)務(wù)需求,我給前端展示的內(nèi)容不能顯示數(shù)字(0,1,2),要展示漢字(未知,男人,女人),數(shù)據(jù)映射在后端完成。 結(jié)合php8引入了枚舉的支持。那么我們重新設(shè)計如下
<?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(); //獲得中文映射
由上可知,是不是看著就簡單了許多。
但是,還有更直觀的顯示,設(shè)計會稍微復(fù)雜一點,我們接著慢慢向下看。
我們先設(shè)計一個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è)計一個注解類,讓這個注解類可以注解 enum - case
<?php
#[\Attribute(\Attribute::TARGET_CLASS_CONSTANT)]
class CaseDescription
{
public function __construct(
public string $description
){}
}
重構(gòu) enum 設(shè)計如下
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;
}
}
這樣看著是否直觀了很多?對比之前的方案,也便于維護。
完整版,應(yīng)業(yè)務(wù)需求,不同的性別在頁面上呈現(xiàn)的性別顏色也不同。
再設(shè)計一個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;
}
}
以上就是我對注解的實際應(yīng)用。當(dāng)然再hyperf 框架中,注解實際上被賦予了更多的含義(如自動注入等高級功能,類似java的spring容器了)
總結(jié)
以前總覺得php 語言開發(fā)大型項目并不是很適合,但現(xiàn)在php8出來后,個人覺得php8越來越適合開發(fā)大型項目,祝php越來越好,能夠再眾多的開發(fā)語言中再次脫穎而出。php是世界上最好的語言~
到此這篇關(guān)于詳解php8中注解的實際應(yīng)用的文章就介紹到這了,更多相關(guān)php8注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PHP中數(shù)據(jù)類型轉(zhuǎn)換的三種方式
這篇文章主要介紹了PHP中數(shù)據(jù)類型轉(zhuǎn)換的三種方式,本文講解了允許轉(zhuǎn)換的PHP數(shù)據(jù)類型、PHP數(shù)據(jù)類型的三種轉(zhuǎn)換方式等內(nèi)容,需要的朋友可以參考下2015-04-04
PHP strip_tags()去除HTML、XML以及PHP的標(biāo)簽介紹
這篇文章主要介紹了PHP strip_tags()去除HTML、XML以及PHP的標(biāo)簽介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-02-02
DedeCMS 核心類TypeLink.class.php摘要筆記
DedeCMS 核心類TypeLink.class.php摘要筆記,學(xué)習(xí)php就是借鑒與分析,讓自己的掌握的更多。2010-04-04

