Test Failed
Push — drivers ( a5e726...03304c )
by Joe
06:31
created

if_not_null()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 1
nc 2
nop 3
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace PhpWinTools\WmiScripting\Support {
4
5
    use Closure;
6
    use ReflectionClass;
7
    use PhpWinTools\WmiScripting\Configuration\Config;
8
    use PhpWinTools\WmiScripting\Configuration\Resolver;
9
    use PhpWinTools\WmiScripting\Connections\ComConnection;
10
    use PhpWinTools\WmiScripting\Collections\ArrayCollection;
11
    use PhpWinTools\WmiScripting\Exceptions\InvalidArgumentException;
12
    use PhpWinTools\WmiScripting\Exceptions\InvalidConnectionException;
13
14
    /**
15
     * Checks for the existence of a property.
16
     *
17
     * @param $class
18
     * @param $property_name
19
     *
20
     * @throws InvalidArgumentException
21
     *
22
     * @return bool
23
     */
24
    function class_has_property($class, $property_name): bool
25
    {
26
        $class = is_object($class) ? get_class($class) : $class;
27
28
        try {
29
            return (new ReflectionClass($class))->hasProperty($property_name);
30
        } catch (\Exception $exception) {
31
            throw new InvalidArgumentException("Unable to reflect on {$class}.", null, $exception);
32
        }
33
    }
34
35
    /**
36
     * Expects either a class name or instance and will return if the given trait exists on the class.
37
     *
38
     * @param $class
39
     * @param $trait
40
     *
41
     * @return bool
42
     */
43
    function class_has_trait($class, $trait): bool
44
    {
45
        return array_key_exists($trait, class_traits(is_object($class) ? get_class($class) : $class));
46
    }
47
48
    /**
49
     * Returns all traits of the given class or instance. It also checks the traits for any used traits.
50
     *
51
     * @param $class
52
     *
53
     * @return array
54
     */
55
    function class_traits($class)
56
    {
57
        $class = is_object($class) ? get_class($class) : $class;
58
59
        $traits = class_uses($class);
60
61
        while ($class = get_parent_class($class)) {
62
            $traits += class_uses($class);
63
        }
64
65
        $trait_traits = [];
66
67
        foreach ($traits as $trait) {
68
            $trait_traits += trait_traits($trait);
69
        }
70
71
        return array_merge($trait_traits, $traits);
72
    }
73
74
    /**
75
     * @param ComConnection|string|null $connection
76
     * @param ComConnection|string|null $default
77
     * @param Config|null               $config
78
     *
79
     * @return ComConnection|string|null
80
     */
81
    function connection($connection = null, $default = null, Config $config = null)
82
    {
83
        if (is_null($connection) && is_null($default)) {
84
            return core($config)->getConnection();
85
        }
86
87
        if (is_string($connection) && trim($connection) !== '') {
88
            $connection = core($config)->getConnection($connection);
89
        }
90
91
        if (!$connection instanceof ComConnection && $default) {
92
            return connection($default, null, core($config));
93
        }
94
95
        if (!$connection instanceof ComConnection) {
96
            throw InvalidConnectionException::new($connection);
97
        }
98
99
        return $connection;
100
    }
101
102
    /**
103
     * @param Config|null $config
104
     *
105
     * @return Config
106
     */
107
    function core(Config $config = null)
108
    {
109
        return $config ?? Config::instance();
110
    }
111
112
    /**
113
     * Gets the default value of the given property through the parent.
114
     *
115
     * @param $class
116
     * @param $property_name
117
     *
118
     * @return array
119
     */
120
    function get_ancestor_property($class, $property_name)
121
    {
122
        $class = is_object($class) ? get_class($class) : $class;
123
124
        return ArrayCollection::collect(class_parents($class))->map(function ($class) use ($property_name) {
125
            return (new ReflectionClass($class))->getDefaultProperties()[$property_name] ?? [];
126
        })->values()->collapse()->toArray();
127
    }
128
129
    /**
130
     * Simple null check and replace only when $value is not null. Created to make string concatenations
131
     * a little cleaner to avoid having to have an extra variable.
132
     *
133
     * @param mixed      $value
134
     * @param mixed      $then
135
     * @param mixed|null $else
136
     *
137
     * @return mixed
138
     */
139
    function if_not_null($value, $then, $else = null)
140
    {
141
        return !is_null($value) ? $then : $else;
142
    }
143
144
    /**
145
     * @param string       $class
146
     * @param mixed|object $instance
147
     *
148
     * @return bool
149
     */
150
    function is(string $class, $instance): bool
151
    {
152
        return class_exists($class) && $instance instanceof $class;
153
    }
154
155
    function is_closure($instance): bool
156
    {
157
        return is(Closure::class, $instance);
158
    }
159
160
    /**
161
     * @param string       $class
162
     * @param mixed|object $instance
163
     *
164
     * @return bool
165
     */
166
    function is_not(string $class, $instance): bool
167
    {
168
        return is($class, $instance) === false;
169
    }
170
171
    /**
172
     * @param $instance
173
     *
174
     * @return bool
175
     */
176
    function is_not_closure($instance): bool
177
    {
178
        return is_closure($instance) === false;
179
    }
180
181
    /**
182
     * @param string|null $class
183
     * @param mixed       $parameters
184
     *
185
     * @return Resolver|mixed|null
186
     */
187
    function resolve(string $class = null, ...$parameters)
188
    {
189
        return core()($class, $parameters);
190
    }
191
192
193
    /**
194
     * Returns all of the traits that a trait uses including it's ancestors.
195
     *
196
     * @param $trait_name
197
     *
198
     * @return array
199
     */
200
    function trait_traits($trait_name)
201
    {
202
        $traits = class_uses($trait_name);
203
204
        foreach ($traits as $trait) {
205
            $traits += trait_traits($trait);
206
        }
207
208
        return $traits;
209
    }
210
}
211