Completed
Push — master ( 5da5cb...3308aa )
by Basenko
15s queued 10s
created

Enum::ruleByKey()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
crap 1
1
<?php
2
3
namespace MadWeb\Enum;
4
5
use MadWeb\Enum\Rules\EnumRule;
6
use MyCLabs\Enum\Enum as MyCLabsEnum;
7
8
abstract class Enum extends MyCLabsEnum
9
{
10
    /**
11
     * Default enum value.
12
     */
13
    const __default = null;
14
15
    /**
16
     * {@inheritdoc}
17
     */
18 39
    public function __construct($value = null)
19
    {
20 39
        if (is_null($value)) {
21 15
            $value = static::__default;
22
        }
23
24 39
        parent::__construct($value);
25 39
    }
26
27 3
    public static function randomKey(): string
28
    {
29 3
        $keys = self::keys();
30
31 3
        return $keys[array_rand($keys)];
32
    }
33
34 3
    public static function randomValue(): string
35
    {
36 3
        $values = self::values();
37
38 3
        return $values[array_rand($values)];
39
    }
40
41 6
    public function label(): string
42
    {
43 6
        return self::getLabel($this->getValue());
44
    }
45
46 3
    public static function labels(): array
47
    {
48 3
        $result = [];
49
50 3
        foreach (static::toArray() as $value) {
51 3
            $result[$value] = static::getLabel($value);
0 ignored issues
show
Bug introduced by
Since getLabel() is declared private, calling it with static will lead to errors in possible sub-classes. You can either use self, or increase the visibility of getLabel() to at least protected.

Let’s assume you have a class which uses late-static binding:

class YourClass
{
    private static function getTemperature() {
        return "3422 °C";
}

public static function getSomeVariable()
{
    return static::getTemperature();
}

}

The code above will run fine in your PHP runtime. However, if you now create a sub-class and call the getSomeVariable() on that sub-class, you will receive a runtime error:

class YourSubClass extends YourClass {
      private static function getTemperature() {
        return "-182 °C";
    }
}

print YourSubClass::getSomeVariable(); // Will cause an access error.

In the case above, it makes sense to update SomeClass to use self instead:

class YourClass
{
    private static function getTemperature() {
        return "3422 °C";
    }

    public static function getSomeVariable()
    {
        return self::getTemperature();
    }
}
Loading history...
52
        }
53
54 3
        return $result;
55
    }
56
57 9
    private static function getLabel(string $value): string
58
    {
59 9
        $lang_key = sprintf(
60 9
            '%s.%s.%s',
61 9
            config('enum.lang_file_path'),
62 9
            static::class,
63 9
            $value
64
        );
65
66 9
        return trans()->has($lang_key) ? __($lang_key) : $value;
67
    }
68
69 6
    public function is($value)
70
    {
71 6
        return $this->getValue() === ($value instanceof self ? $value->getValue() : $value);
72
    }
73
74 81
    public static function toArray(bool $include_default = false): array
75
    {
76 81
        $result = parent::toArray();
77
78 81
        if (isset($result['__default']) and ! $include_default) {
79 81
            unset($result['__default']);
80
        }
81
82 81
        return $result;
83
    }
84
85
    /**
86
     * Returns all consts (possible values) as an array according to `SplEnum` class.
87
     */
88 6
    public function getConstList(bool $include_default = false): array
89
    {
90 6
        return static::toArray($include_default);
91
    }
92
93
    /**
94
     * Returns the validation rule (to validate by value).
95
     *
96
     * @return EnumRule
97
     */
98 6
    public static function rule(): EnumRule
99
    {
100 6
        return new EnumRule(static::class, false);
101
    }
102
103
    /**
104
     * Returns the validation rule (to validate by key).
105
     *
106
     * @return EnumRule
107
     */
108 6
    public static function ruleByKey(): EnumRule
109
    {
110 6
        return new EnumRule(static::class, true);
111
    }
112
}
113