合肥網(wǎng)站的優(yōu)化seo外鏈怎么發(fā)
前言
學(xué)過java的同學(xué)應(yīng)該都知道注解的作用,但是在php中注解有什么用呢?我的理解就是美化代碼和便于維護(hù)一些類的設(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è)計如下
<?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(); //獲得中文映射
由上可知,是不是看著就簡單了許多。
但是,還有更直觀的顯示,設(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;}
}
這樣看著是否直觀了很多?對比之前的方案,也便于維護(hù)。
完整版,應(yīng)業(yè)務(wù)需求,不同的性別在頁面上呈現(xiàn)的性別顏色也不同。
再設(shè)計一個Color注解
<?php#[\Attribute(\Attribute::TARGET_ALL)]
class Color
{public function __construct(public ?string $value = null){}
}
對性別進(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;}
}
以上就是我對注解的實際應(yīng)用。當(dāng)然再hyperf 框架中,注解實際上被賦予了更多的含義(如自動注入等高級功能,類似java的spring容器了)
總結(jié)
以前總覺得php 語言開發(fā)大型項目并不是很適合,但現(xiàn)在php8出來后,個人覺得php8越來越適合開發(fā)大型項目,祝php越來越好,能夠再眾多的開發(fā)語言中再次脫穎而出。php是世界上最好的語言~