因为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());
}