Lightweight implementation of enum value object

v4.1 2023-12-07 11:36 UTC

This package is auto-updated.

Last update: 2024-12-07 13:53:57 UTC


README

Lightweight implementation of enum value object in PHP.

Installation

Use Composer to install the package:

composer require intraworlds/enum

Usage

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']);

PHPStan integration

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

Alternatives

  • 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.

License

All contents of this package are licensed under the MIT license.