Skip to content

Commit

Permalink
Добавлена статическая функция get
Browse files Browse the repository at this point in the history
  • Loading branch information
vjik committed Feb 26, 2018
1 parent a37e3bc commit edc281b
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 6 deletions.
31 changes: 26 additions & 5 deletions Enum.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,12 @@ abstract class Enum
/**
* @var array
*/
protected static $_cache = [];
protected static $_cacheItems = [];

/**
* @var array
*/
protected static $_cacheInstances = [];

/**
* @var int|string
Expand All @@ -44,6 +49,22 @@ public function __construct($id)
}
}

/**
* @param int|string $id
* @return static
* @throws ReflectionException
* @throws UnexpectedValueException
* @since 2.1.0
*/
public static function get($id)
{
$key = get_called_class() . '~' . $id;
if (empty(static::$_cacheInstances[$key])) {
static::$_cacheInstances[$key] = new static($id);
}
return static::$_cacheInstances[$key];
}

/**
* Проверяет входит ли значение в допустимые
* @param int|string $id
Expand All @@ -65,7 +86,7 @@ public static function isValid($id, array $filter = [])
public static function toArray(array $filter = [])
{
$class = get_called_class();
if (!array_key_exists($class, static::$_cache)) {
if (!array_key_exists($class, static::$_cacheItems)) {
$reflection = new \ReflectionClass($class);
if (is_callable([$class, 'items'])) {
/** @noinspection PhpUndefinedMethodInspection */
Expand All @@ -82,9 +103,9 @@ public static function toArray(array $filter = [])
}
$items[$constant]['id'] = $constant;
}
static::$_cache[$class] = $items;
static::$_cacheItems[$class] = $items;
}
$items = array_filter(static::$_cache[$class], function ($item) use ($filter) {
$items = array_filter(static::$_cacheItems[$class], function ($item) use ($filter) {
foreach ($filter as $key => $filterItem) {
if (is_int($key)) {
list($operator, $key, $value) = $filterItem;
Expand Down Expand Up @@ -181,7 +202,7 @@ public static function toObjects(array $filter = [])
{
$objects = [];
foreach (static::toIds($filter) as $id) {
$objects[$id] = new static($id);
$objects[$id] = static::get($id);
}
return $objects;
}
Expand Down
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,10 +83,16 @@ class Status extends Enum

## Создание объекта

Создать объект можно через создание класса или статическую функцию `get`:

```php
$status = new Status(Status::DRAFT);
$status = Status::get(Status::DRAFT);
```

Второй вариант препочтительнее, так как он кэширует объекты и, если объект уже был инициализирован,
то он будет взят из кэша, а не будет создан заново.

## <a name="toIds"></a>Список значений `toIds`

Возвращает массив значений объекта. Поддерживает [фильтрацию](#filtering).
Expand Down
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "vjik/php-enum",
"description": "PHP 5.4+ Enum implementation",
"version": "2.0.0",
"version": "2.1.0",
"type": "library",
"keywords": [
"php",
Expand Down

0 comments on commit edc281b

Please sign in to comment.