詳解php8中注解的實際應用
前言
學過java的同學應該都知道注解的作用,但是在php中注解有什么用呢?我的理解就是美化代碼和便于維護一些類的設計。
說明
我們先設計一個類,聲明人類的性別
<?php
class Sex
{
//男人
const MAN = 1;
//女人
const WIFE = 2;
//未知
const UNKNOWN = 0;
}
由上可知,我們分別設計了3個類型,0=>未知,1=>男人,2=>女人
現在,應業(yè)務需求,我給前端展示的內容不能顯示數字(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;
}
}
這樣看著是否直觀了很多?對比之前的方案,也便于維護。
完整版,應業(yè)務需求,不同的性別在頁面上呈現的性別顏色也不同。
再設計一個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 語言開發(fā)大型項目并不是很適合,但現在php8出來后,個人覺得php8越來越適合開發(fā)大型項目,祝php越來越好,能夠再眾多的開發(fā)語言中再次脫穎而出。php是世界上最好的語言~
到此這篇關于詳解php8中注解的實際應用的文章就介紹到這了,更多相關php8注解內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
php array_map使用自定義的函數處理數組中的每個值
這篇文章主要介紹了php array_map使用自定義的函數處理數組中的每個值的相關資料,需要的朋友可以參考下2016-10-10
PHP中call_user_func_array回調函數的用法示例
這篇文章主要給大家介紹了PHP中call_user_func_array回調函數的用法,文中給出了詳細的示例代碼,相信對大家的理解和學習很有幫助,有需要的朋友們可以參考借鑒,下面來一起學習學習吧。2016-11-11

