@@ -122,33 +122,22 @@ final public function getOrdinal()
122
122
*/
123
123
final static public function get ($ value )
124
124
{
125
- $ class = get_called_class ();
126
- if (isset (self ::$ instances [$ class ][$ value ])) {
127
- return self ::$ instances [$ class ][$ value ];
128
- }
129
-
130
- // find the real value
125
+ $ class = get_called_class ();
131
126
$ constants = self ::detectConstants ($ class );
132
- $ name = array_search ($ value , $ constants , true ); // use strict, see next lines
127
+ $ name = array_search ($ value , $ constants , true );
133
128
if ($ name === false ) {
134
- // Bnumeration values have to be unique by their string representation.
135
- // Because array_search searches in strict mode or in non-strict mode only
136
- // we have to search for a value of the same string our self.
137
- // (see issue #26)
138
- $ valueStr = (string ) $ value ;
139
- $ found = false ;
140
- foreach ($ constants as $ name => $ constValue ) {
141
- if ($ valueStr === (string ) $ constValue ) {
142
- $ found = true ;
143
- break ;
144
- }
145
- }
146
- if (!$ found ) {
147
- throw new InvalidArgumentException ("Unknown value ' {$ value }' " );
129
+ if (is_scalar ($ value )) {
130
+ throw new InvalidArgumentException ('Unknown value ' . var_export ($ value , true ));
131
+ } else {
132
+ throw new InvalidArgumentException ('Invalid value of type ' . gettype ($ value ));
148
133
}
149
134
}
150
135
151
- return self ::$ instances [$ class ][$ value ] = new $ class ($ constants [$ name ]);
136
+ if (!isset (self ::$ instances [$ class ][$ name ])) {
137
+ self ::$ instances [$ class ][$ name ] = new $ class ($ constants [$ name ]);
138
+ }
139
+
140
+ return self ::$ instances [$ class ][$ name ];
152
141
}
153
142
154
143
/**
@@ -161,18 +150,18 @@ final static public function get($value)
161
150
*/
162
151
final public static function getByName ($ name )
163
152
{
153
+ $ name = (string ) $ name ;
164
154
$ class = get_called_class ();
155
+ if (isset (self ::$ instances [$ class ][$ name ])) {
156
+ return self ::$ instances [$ class ][$ name ];
157
+ }
158
+
165
159
$ const = $ class . ':: ' . $ name ;
166
160
if (!defined ($ const )) {
167
161
throw new InvalidArgumentException ($ const . ' not defined ' );
168
162
}
169
163
170
- $ value = constant ($ const );
171
- if (isset (self ::$ instances [$ class ][$ value ])) {
172
- return self ::$ instances [$ class ][$ value ];
173
- }
174
-
175
- return self ::$ instances [$ class ][$ value ] = new $ class ($ value );
164
+ return self ::$ instances [$ class ][$ name ] = new $ class (constant ($ const ));
176
165
}
177
166
178
167
/**
@@ -196,12 +185,12 @@ final public static function getByOrdinal($ordinal)
196
185
));
197
186
}
198
187
199
- $ value = current ($ item );
200
- if (isset (self ::$ instances [$ class ][$ value ])) {
201
- return self ::$ instances [$ class ][$ value ];
188
+ $ name = key ($ item );
189
+ if (isset (self ::$ instances [$ class ][$ name ])) {
190
+ return self ::$ instances [$ class ][$ name ];
202
191
}
203
192
204
- return self ::$ instances [$ class ][$ value ] = new $ class ($ value , $ ordinal );
193
+ return self ::$ instances [$ class ][$ name ] = new $ class (current ( $ item ) , $ ordinal );
205
194
}
206
195
207
196
/**
@@ -240,19 +229,25 @@ static private function detectConstants($class)
240
229
$ reflection = new ReflectionClass ($ class );
241
230
$ constants = $ reflection ->getConstants ();
242
231
243
- // Constant values needs to be unique
244
- if (max (array_count_values ($ constants )) > 1 ) {
245
- $ ambiguous = array_map (function ($ v ) use ($ constants ) {
246
- return implode ('/ ' , array_keys ($ constants , $ v )) . '= ' . $ v ;
247
- }, array_unique (array_diff_assoc ($ constants , array_unique ($ constants ))));
248
- throw new LogicException (sprintf (
249
- 'All possible values needs to be unique. The following are ambiguous: %s ' ,
250
- implode (', ' , $ ambiguous )
251
- ));
232
+ // values needs to be unique
233
+ $ ambiguous = array ();
234
+ foreach ($ constants as $ value ) {
235
+ $ names = array_keys ($ constants , $ value , true );
236
+ if (count ($ names ) > 1 ) {
237
+ $ ambiguous [var_export ($ value , true )] = $ names ;
238
+ }
239
+ }
240
+ if ($ ambiguous ) {
241
+ throw new LogicException (
242
+ 'All possible values needs to be unique. The following are ambiguous: '
243
+ . implode (', ' , array_map (function ($ names ) use ($ constants ) {
244
+ return implode ('/ ' , $ names ) . '= ' . var_export ($ constants [$ names [0 ]], true );
245
+ }, $ ambiguous ))
246
+ );
252
247
}
253
248
254
249
// This is required to make sure that constants of base classes will be the first
255
- while (($ reflection = $ reflection ->getParentClass ()) && $ reflection ->name != ' MabeEnum\Enum ' ) {
250
+ while (($ reflection = $ reflection ->getParentClass ()) && $ reflection ->name != __CLASS__ ) {
256
251
$ constants = $ reflection ->getConstants () + $ constants ;
257
252
}
258
253
0 commit comments