public static final function getByOrdinal($ordinal)
{
$ordinal = (int) $ordinal;
$class = get_called_class();
$constants = self::detectConstants($class);
$item = array_slice($constants, $ordinal, 1, true);
if (empty($item)) {
throw new InvalidArgumentException(sprintf('Invalid ordinal number, must between 0 and %s', count($constants) - 1));
}
$name = key($item);
if (isset(self::$instances[$class][$name])) {
return self::$instances[$class][$name];
}
return self::$instances[$class][$name] = new $class(current($item), $ordinal);
}