| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 | <?php/** * @link    http://github.com/myclabs/php-enum * @license http://www.opensource.org/licenses/mit-license.php MIT (see the LICENSE file) */namespace MyCLabs\Enum;/** * Base Enum class * * Create an enum by implementing this class and adding class constants. * * @author Matthieu Napoli <matthieu@mnapoli.fr> * @author Daniel Costa <danielcosta@gmail.com> * @author Mirosław Filip <mirfilip@gmail.com> */abstract class Enum implements \JsonSerializable{    /**     * Enum value     *     * @var mixed     */    protected $value;    /**     * Store existing constants in a static cache per object.     *     * @var array     */    protected static $cache = [];    /**     * Creates a new value of some type     *     * @param mixed $value     *     * @throws \UnexpectedValueException if incompatible type is given.     */    public function __construct($value)    {        if ($value instanceof static) {            $value = $value->getValue();        }        if (!$this->isValid($value)) {            throw new \UnexpectedValueException("Value '$value' is not part of the enum " . \get_called_class());        }        $this->value = $value;    }    /**     * @return mixed     */    public function getValue()    {        return $this->value;    }    /**     * Returns the enum key (i.e. the constant name).     *     * @return mixed     */    public function getKey()    {        return static::search($this->value);    }    /**     * @return string     */    public function __toString()    {        return (string)$this->value;    }    /**     * Determines if Enum should be considered equal with the variable passed as a parameter.     * Returns false if an argument is an object of different class or not an object.     *     * This method is final, for more information read https://github.com/myclabs/php-enum/issues/4     *     * @return bool     */    final public function equals($variable = null): bool    {        return $variable instanceof self            && $this->getValue() === $variable->getValue()            && \get_called_class() === \get_class($variable);    }    /**     * Returns the names (keys) of all constants in the Enum class     *     * @return array     */    public static function keys()    {        return \array_keys(static::toArray());    }    /**     * Returns instances of the Enum class of all Enum constants     *     * @return static[] Constant name in key, Enum instance in value     */    public static function values()    {        $values = array();        foreach (static::toArray() as $key => $value) {            $values[$key] = new static($value);        }        return $values;    }    /**     * Returns all possible values as an array     *     * @return array Constant name in key, constant value in value     */    public static function toArray()    {        $class = \get_called_class();        if (!isset(static::$cache[$class])) {            $reflection            = new \ReflectionClass($class);            static::$cache[$class] = $reflection->getConstants();        }        return static::$cache[$class];    }    /**     * Check if is valid enum value     *     * @param $value     *     * @return bool     */    public static function isValid($value)    {        return \in_array($value, static::toArray(), true);    }    /**     * Check if is valid enum key     *     * @param $key     *     * @return bool     */    public static function isValidKey($key)    {        $array = static::toArray();        return isset($array[$key]) || \array_key_exists($key, $array);    }    /**     * Return key for value     *     * @param $value     *     * @return mixed     */    public static function search($value)    {        return \array_search($value, static::toArray(), true);    }    /**     * Returns a value when called statically like so: MyEnum::SOME_VALUE() given SOME_VALUE is a class constant     *     * @param string $name     * @param array  $arguments     *     * @return static     * @throws \BadMethodCallException     */    public static function __callStatic($name, $arguments)    {        $array = static::toArray();        if (isset($array[$name]) || \array_key_exists($name, $array)) {            return new static($array[$name]);        }        throw new \BadMethodCallException("No static method or enum constant '$name' in class " . \get_called_class());    }    /**     * Specify data which should be serialized to JSON. This method returns data that can be serialized by json_encode()     * natively.     *     * @return mixed     * @link http://php.net/manual/en/jsonserializable.jsonserialize.php     */    public function jsonSerialize()    {        return $this->getValue();    }}
 |