@ 2015-04-02T09:08:49Z <?php
namespace Derp;
abstract class Enum
{
protected $value;
protected static $possibleValues;
protected static function getPossibleValues()
{
if (static::$possibleValues) {
return static::$possibleValues;
}
$reflectionClass = new \ReflectionClass(get_called_class());
static::$possibleValues = $reflectionClass->getConstants();
return static::$possibleValues;
}
/**
* @param $name
* @param $arguments
* @return static
* @throws \Exception
*/
public static function __callStatic($name, $arguments)
{
$possibleValues = static::getPossibleValues();
if (!array_key_exists($name, $possibleValues)) {
throw new \Exception;
}
if (count($arguments) > 0) {
throw new \Exception;
}
return self::createInstance($name, $possibleValues[$name]);
}
/**
* @param $value
* @return static
*/
protected static function createInstance($value)
{
$enum = new static;
$enum->value = $value;
return $enum;
}
protected function getValue()
{
return $this->value;
}
public function equals(Enum $otherValue)
{
return get_class($otherValue) === get_called_class() && $otherValue->getValue() === $this->getValue();
}
public static function all()
{
return array_map(
function($value) {
return static::createInstance($value);
},
static::getPossibleValues()
);
}
}
class Day extends Enum
{
const MONDAY = 'monday';
const FRIDAY = 'friday';
}
$monday = Day::MONDAY();
var_dump($monday);
var_dump($monday->equals(Day::FRIDAY()));
var_dump(Day::all());
Enable javascript to submit You have javascript disabled. You will not be able to edit any code.
Output for 5.4.30 - 5.4.45 , 5.5.24 - 5.5.35 , 5.6.8 - 5.6.28 , 7.0.0 - 7.0.20 , 7.1.0 - 7.1.10 , 7.2.0 - 7.2.33 , 7.3.16 - 7.3.33 , 7.4.0 - 7.4.33 , 8.0.0 - 8.0.30 , 8.1.0 - 8.1.28 , 8.2.0 - 8.2.19 , 8.3.0 - 8.3.7 object(Derp\Day)#1 (1) {
["value":protected]=>
string(6) "MONDAY"
}
bool(false)
array(2) {
["MONDAY"]=>
object(Derp\Day)#3 (1) {
["value":protected]=>
string(6) "monday"
}
["FRIDAY"]=>
object(Derp\Day)#4 (1) {
["value":protected]=>
string(6) "friday"
}
}
Output for 5.4.0 - 5.4.29 object(Derp\Day)#1 (1) {
["value":protected]=>
string(6) "MONDAY"
}
bool(false)
Fatal error: Cannot instantiate abstract class Derp\Enum in /in/ou19Z on line 49
Process exited with code 255 . Output for 5.3.0 - 5.3.29 object(Derp\Day)#1 (1) {
["value":protected]=>
string(6) "MONDAY"
}
bool(false)
Fatal error: Cannot access static:: when no class scope is active in /in/ou19Z on line 68
Process exited with code 255 . Output for 4.4.2 - 4.4.9 , 5.1.0 - 5.1.6 , 5.2.0 - 5.2.17 Parse error: syntax error, unexpected T_STRING in /in/ou19Z on line 3
Process exited with code 255 . Output for 4.3.0 - 4.3.1 , 4.3.5 - 4.3.11 , 4.4.0 - 4.4.1 , 5.0.0 - 5.0.5 Parse error: parse error, unexpected T_STRING in /in/ou19Z on line 3
Process exited with code 255 . Output for 4.3.2 - 4.3.4 Parse error: parse error in /in/ou19Z on line 3
Process exited with code 255 . preferences:dark mode live preview
191.43 ms | 401 KiB | 312 Q