因為php沒有自己的enum
如果要實現
就要三方擴展,如 SPL_Types
需要pecl 或者自己編譯安裝,不是很方便
或者通過composer 引入第三方庫
用法跟下面相似
查看 github 源代碼
1.直接通過 composer 引入到項目
composer require wgx954418992/php-enum
2.調用
<?php
use enum\classier\Enum;
require '../vendor/autoload.php';
/**
* Class OrderStatus
*
* @warning `常量值不能重復`
*/
class OrderStatus extends Enum
{
/**
* 訂單狀態 待支付
*/
public const WAIT_PAY = 'WAIT_PAY';
/**
* 訂單狀態 已支付
*/
public const PAYED = 'PAYED';
/**
* 訂單狀態 配送中
*/
public const DELIVERING = 'DELIVERING';
/**
* 訂單狀態 已完成
*/
public const COMPLETE = 'COMPLETE';
/**
* 訂單狀態 已評論
*/
public const COMMENTED = 'COMMENTED';
/**
* 獲取常量`WAIT_PAY`的實際值,它將在構造時調用,以后不會再調用,并且優先級高于靜態屬性
*/
protected function getWaitPay()
{
return new class {
/**
* @var string
*/
private $text = "待支付";
/**
* @return string
*/
public function getText(): string
{
return $this->text;
}
};
}
/**
* 常量 PAYED 實際值
* @var string[]
*/
protected static $_PAYED = ['text' => '已支付'];
}
try {
$status = new OrderStatus(OrderStatus::WAIT_PAY);
echo "name: {$status->getName()}" . PHP_EOL;
echo "value:" . PHP_EOL;
print_r($status->getValue());
echo PHP_EOL;
$status->then(OrderStatus::WAIT_PAY, OrderStatus::PAYED, function () {
echo '命中 WAIT_PAY,PAYED' . PHP_EOL;
})
->then(OrderStatus::DELIVERING, function () {
echo '命中 DELIVERING' . PHP_EOL;
})
->then(OrderStatus::COMPLETE, function () {
echo '命中 COMPLETE' . PHP_EOL;
})
->then(OrderStatus::COMMENTED, function () {
echo '命中 COMMENTED' . PHP_EOL;
})
->fetch();
} catch (Exception $e) {
exit($e->getMessage());
}