File tree 3 files changed +74
-4
lines changed
3 files changed +74
-4
lines changed Original file line number Diff line number Diff line change @@ -165,6 +165,21 @@ public static function search($value)
165
165
return array_search ($ value , static ::toArray (), true );
166
166
}
167
167
168
+ /**
169
+ * Returns Enum by key
170
+ *
171
+ * @return static
172
+ */
173
+ public static function fromKey ($ name )
174
+ {
175
+ $ array = static ::toArray ();
176
+ if (array_key_exists ($ name , $ array )) {
177
+ return EnumManager::get (new static ($ array [$ name ]));
178
+ }
179
+
180
+ return null ;
181
+ }
182
+
168
183
/**
169
184
* Returns a value when called statically like so: MyEnum::SOME_VALUE() given SOME_VALUE is a class constant
170
185
*
@@ -176,11 +191,12 @@ public static function search($value)
176
191
*/
177
192
public static function __callStatic ($ name , $ arguments )
178
193
{
179
- $ array = static ::toArray ();
180
- if (isset ($ array [$ name ])) {
181
- return new static ($ array [$ name ]);
194
+ $ result = static ::fromKey ($ name );
195
+
196
+ if ($ result === null ) {
197
+ throw new \BadMethodCallException ("No static method or enum constant ' $ name' in class " . get_called_class ());
182
198
}
183
199
184
- throw new \ BadMethodCallException ( " No static method or enum constant ' $ name ' in class " . get_called_class ()) ;
200
+ return $ result ;
185
201
}
186
202
}
Original file line number Diff line number Diff line change
1
+ <?php
2
+ /**
3
+ * @link http://github.com/myclabs/php-enum
4
+ * @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file)
5
+ */
6
+
7
+ namespace MyCLabs \Enum ;
8
+
9
+ use ReflectionObject ;
10
+
11
+ /**
12
+ * Enum instance manager
13
+ *
14
+ * @internal
15
+ */
16
+ abstract class EnumManager
17
+ {
18
+ /**
19
+ * Store existing Enum instances.
20
+ *
21
+ * @var array
22
+ */
23
+ private static $ instances = array ();
24
+
25
+ /**
26
+ * Returns the Enum instance for the given prototype
27
+ *
28
+ * @return Enum
29
+ */
30
+ public static function get (Enum $ enum )
31
+ {
32
+ $ reflection = new ReflectionObject ($ enum );
33
+ $ class = $ reflection ->getName ();
34
+ $ name = $ enum ->getKey ();
35
+
36
+ if (isset (self ::$ instances [$ class ][$ name ])) {
37
+ return self ::$ instances [$ class ][$ name ];
38
+ }
39
+
40
+ self ::$ instances [$ class ][$ name ] = $ enum ;
41
+ return $ enum ;
42
+ }
43
+ }
Original file line number Diff line number Diff line change @@ -228,6 +228,17 @@ public function testEquals()
228
228
$ this ->assertTrue ($ foo ->equals ($ anotherFoo ));
229
229
}
230
230
231
+ /**
232
+ * __callStatic()
233
+ */
234
+ public function testSameInstance ()
235
+ {
236
+ $ foo1 = EnumFixture::FOO ();
237
+ $ foo2 = EnumFixture::FOO ();
238
+
239
+ $ this ->assertSame ($ foo1 , $ foo2 );
240
+ }
241
+
231
242
/**
232
243
* equals()
233
244
*/
You can’t perform that action at this time.
0 commit comments