-
Notifications
You must be signed in to change notification settings - Fork 8
/
EnumTrait.php
124 lines (104 loc) · 2.68 KB
/
EnumTrait.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<?php
declare(strict_types=1);
namespace Funeralzone\ValueObjects\Enums;
use Funeralzone\ValueObjects\ValueObject;
trait EnumTrait
{
/**
* @var int
*/
protected $value;
/**
* @var null|array
*/
private static $constantsCache;
/**
* EnumTrait constructor.
* @param int $value
*/
public function __construct(int $value)
{
// Value must be a valid option
if (!in_array($value, static::constantValues())) {
throw new \InvalidArgumentException($value . ' is not a valid value for this enum.');
}
$this->value = $value;
}
/**
* @return bool
*/
public function isNull(): bool
{
return false;
}
/**
* @param ValueObject $object
* @return bool
*/
public function isSame(ValueObject $object): bool
{
return ($this->toNative() === $object->toNative());
}
/**
* @param int $native
* @return static
*/
public static function fromNative($native)
{
if (!is_string($native)) {
throw new \InvalidArgumentException('This method can only instantiate an object using a string.');
}
// Native must be a valid constant name
if (!in_array($native, static::constantKeys())) {
throw new \InvalidArgumentException($native . ' is not a valid value for this enum.');
}
$integer = static::constants()[$native];
return new static($integer);
}
/**
* @return string
*/
public function toNative()
{
return array_search($this->value, static::constants());
}
/**
* @param $name
* @param $arguments
* @return static
*/
public static function __callStatic($name, $arguments)
{
if (!in_array($name, static::constantKeys())) {
throw new \RuntimeException($name . ' is an invalid value for this enum.');
}
return new static(constant(get_called_class() . '::' . $name));
}
/**
* @return array
*/
private static function constantValues(): array
{
$constants = static::constants();
return array_values($constants);
}
/**
* @return array
*/
private static function constantKeys(): array
{
$constants = static::constants();
return array_keys($constants);
}
/**
* @return array
*/
private static function constants(): array
{
if (static::$constantsCache !== null) {
return static::$constantsCache;
}
$reflect = new \ReflectionClass(get_called_class());
return static::$constantsCache = $reflect->getConstants();
}
}