Lightweight implementation of enum value object in PHP.
Use Composer to install the package:
composer require intraworlds/enum
Extend IW\Enum
and add arbitrary constants which becomes your enum keys.
final class Hash extends Enum
{
const MD5 = 'md5';
const SHA1 = 'sha1';
}
Obtain instance of enum value by calling static function <classname>::<key>()
.
$md5 = Hash::MD5();
Main advantage of use this library is of cource type hinting. Therefore given instance is always valid in principle of DDD value object.
function crack(Hash $hash) {
echo 'cracking ... ' . $hash; // notice that enum is implementing __toString() method
}
crack(Hash::SHA1()); // cracking ... sha1
crack(Hash::SHA1); // throws TypeError
The function is returning a singleton so you can compare it with ===
var_dump($md5 === MD5()); // true
var_dump($md5 === SHA1()); // false
Actually you must use ===
for strict comparison. With ==
loose comparison PHP compares only that objects are the same class.
var_dump($md5 == MD5()); // true
var_dump($md5 == SHA1()); // true - DON'T use == comparison!
Access actual value with method getValue()
var_dump($md5->getValue() === Hash::MD5); // true
Switch statements must be defined by values because of loose comparison.
switch ($hash->getValue()) {
case Hash::MD5: ...
case Hash::SHA1: ...
}
You can user method search()
for obtaining instance of enum by a value.
$contentType = ContentTypeEnum::search(apache_request_headers()['Content-Type']);
This library is distributed with PHPStan extension which's providing magic methods reflection. Just add following configuration to your phpstan.neon
services:
-
class: IW\PHPStan\Reflection\EnumMethodsReflectionExtension
tags:
- phpstan.broker.methodsClassReflectionExtension
- we took most of the inspiration from library myclabs/php-enum. It's nice implementation but it's missing singletons and it's not optimized for PHP7.
- PHP's SplEnum needs an extension and also does not support singletons.
All contents of this package are licensed under the MIT license.