eloquent/enumeration
最新稳定版本:6.0.0
Composer 安装命令:
composer require eloquent/enumeration
包简介
An enumeration implementation for PHP.
README 文档
README
No longer maintained
This package is no longer maintained. See this statement for more info.
Enumeration
An enumeration implementation for PHP.
Installation
- Available as Composer package eloquent/enumeration.
What is an Enumeration?
In terms of software development, an enumeration (or "enumerated type") is essentially a fixed set of values. These values are called "members" or "elements".
An enumeration is used in circumstances where it is desirable to allow an argument to be only one of a particular set of values, and where anything else is considered invalid.
A basic example
Enumeration can be used like C++ enumerated types. Here is an example, representing a set of HTTP request methods:
use Eloquent\Enumeration\AbstractEnumeration; final class HttpRequestMethod extends AbstractEnumeration { const OPTIONS = 'OPTIONS'; const GET = 'GET'; const HEAD = 'HEAD'; const POST = 'POST'; const PUT = 'PUT'; const DELETE = 'DELETE'; const TRACE = 'TRACE'; const CONNECT = 'CONNECT'; }
This class can now be used in a type hint to easily accept any valid HTTP request method:
function handleHttpRequest(HttpRequestMethod $method, $url, $body = null) { // handle request... }
Accessing enumeration members
Members are accessed by static method calls, like so:
handleHttpRequest(HttpRequestMethod::GET(), 'http://example.org/'); handleHttpRequest(HttpRequestMethod::POST(), 'http://example.org/', 'foo=bar&baz=qux');
For each member of the enumeration, a single instance of the enumeration class
is instantiated (that is, an instance of HttpRequestMethod in the above
example). This means that strict comparison (===) can be used to determine
which member has been passed to a function:
function handleHttpRequest(HttpRequestMethod $method, $url, $body = null) { if ($method === HttpRequestMethod::POST()) { // handle POST requests... } else { // handle other requests... } }
Java-style enumerations
Java's enum types have slightly more functionality than C++ enumerated types. They can have additional properties and/or methods, and are really just a specialised kind of class where there are a fixed set of instances.
This is sometimes called the Multiton pattern, and in fact, all enumerations
in this implementation are Multitons. The AbstractEnumeration class simply
defines its members based upon class constants.
Here is an example borrowed from the Java documentation for its enum types. The following multiton describes all of the planets in our solar system, including their masses and radii:
use Eloquent\Enumeration\AbstractMultiton; final class Planet extends AbstractMultiton { /** * Universal gravitational constant. * * @var float */ const G = 6.67300E-11; /** * @return float */ public function surfaceGravity() { return self::G * $this->mass / ($this->radius * $this->radius); } /** * @param float $otherMass * * @return float */ public function surfaceWeight($otherMass) { return $otherMass * $this->surfaceGravity(); } protected static function initializeMembers() { new static('MERCURY', 3.302e23, 2.4397e6); new static('VENUS', 4.869e24, 6.0518e6); new static('EARTH', 5.9742e24, 6.37814e6); new static('MARS', 6.4191e23, 3.3972e6); new static('JUPITER', 1.8987e27, 7.1492e7); new static('SATURN', 5.6851e26, 6.0268e7); new static('URANUS', 8.6849e25, 2.5559e7); new static('NEPTUNE', 1.0244e26, 2.4764e7); // new static('PLUTO', 1.31e22, 1.180e6); } /** * @param string $key * @param float $mass * @param float $radius */ protected function __construct($key, $mass, $radius) { parent::__construct($key); $this->mass = $mass; $this->radius = $radius; } private $mass; private $radius; }
The above class can be used to take a known weight on earth (in any unit) and calculate the weight on all of the planets (in the same unit):
$earthWeight = 175; $mass = $earthWeight / Planet::EARTH()->surfaceGravity(); foreach (Planet::members() as $planet) { echo sprintf( 'Your weight on %s is %f' . PHP_EOL, $planet, $planet->surfaceWeight($mass) ); }
If the above script is executed, it will produce something like the following output:
Your weight on MERCURY is 66.107480
Your weight on VENUS is 158.422560
Your weight on EARTH is 175.000000
Your weight on MARS is 66.279359
Your weight on JUPITER is 442.677903
Your weight on SATURN is 186.513785
Your weight on URANUS is 158.424919
Your weight on NEPTUNE is 199.055584
Enumerations and class inheritance
When an enumeration is defined, the intent is usually to define a set of valid values that should not change, at least within the lifetime of a program's execution.
Since PHP has no in-built support for enumerations, this library implements them as regular PHP classes. Classes, however, allow for much more extensibility than is desirable in a true enumeration.
For example, a naive enumeration implementation might allow a developer to
extend the HttpRequestMethod class from the examples above (assuming the
final keyword is removed):
class CustomHttpMethod extends HttpRequestMethod { const PATCH = 'PATCH'; }
The problem with this scenario is that all the code written to expect only the
HTTP methods defined in HttpRequestMethod is now compromised. Anybody can
extend HttpRequestMethod to add custom values, essentially voiding the reason
for defining HttpRequestMethod in the first place.
This library provides built-in protection from these kinds of circumstances. Attempting to define an enumeration that extends another enumeration will result in an exception being thrown, unless the 'base' enumeration is abstract.
Abstract enumerations
Assuming that there really is a need to extend HttpRequestMethod, the way to
go about it is to define an abstract base class, then extend this class to
create the desired concrete enumerations:
use Eloquent\Enumeration\AbstractEnumeration; abstract class AbstractHttpRequestMethod extends AbstractEnumeration { const OPTIONS = 'OPTIONS'; const GET = 'GET'; const HEAD = 'HEAD'; const POST = 'POST'; const PUT = 'PUT'; const DELETE = 'DELETE'; const TRACE = 'TRACE'; const CONNECT = 'CONNECT'; } final class HttpRequestMethod extends AbstractHttpRequestMethod {} final class CustomHttpMethod extends AbstractHttpRequestMethod { const PATCH = 'PATCH'; }
In this way, when a developer uses a type hint for HttpRequestMethod, there is
no chance they will ever receive the 'PATCH' method:
function handleHttpRequest(HttpRequestMethod $method, $url, $body = null) { // only handles normal requests... } function handleCustomHttpRequest( CustomHttpRequestMethod $method, $url, $body = null ) { // handles normal requests, and custom requests... }
eloquent/enumeration 适用场景与选型建议
eloquent/enumeration 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 5.68M 次下载、GitHub Stars 达 146, 最近一次更新时间为 2012 年 03 月 24 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「type」 「enum」 「enumeration」 「set」 「class」 「multiton」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 eloquent/enumeration 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 eloquent/enumeration 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 eloquent/enumeration 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
A bundle providing fields for image upload with jquery upload and image cropping with jcrop for symfony2
Enum type behavior for Yii2 based on class constants
A simple Symfony bundle that adds boolean form field type.
A PHP Abstract Enum Class
This package provides type-safe extension of the laravel collection, forcing a single type of object.
Compatibility layer for emulating enumerations in PHP < 8.1 and native enumerations in PHP >= 8.1
统计信息
- 总下载量: 5.68M
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 157
- 点击次数: 21
- 依赖项目数: 75
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2012-03-24