NestedAccess::get()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 3
dl 0
loc 3
rs 10
1
<?php
2
3
namespace Smoren\NestedAccessor\Helpers;
4
5
use Smoren\NestedAccessor\Components\NestedAccessor;
6
use Smoren\NestedAccessor\Exceptions\NestedAccessorException;
7
8
/**
9
 * Helper for getting and setting to source array or object with nested keys
10
 * @author Smoren <[email protected]>
11
 */
12
class NestedAccess
13
{
14
    /**
15
     * @var NestedAccessor|null nested accessor instance
16
     */
17
    protected static ?NestedAccessor $accessor = null;
18
19
    /**
20
     * Gets value from nested source by given path
21
     * @param array<scalar, mixed>|object $source source
22
     * @param string|array<string> $path path e.g. 'path.to.value' or ['path', 'to', 'value']
23
     * @param bool $strict if true: throw exception when path is not found in source
24
     * @return mixed value got by path
25
     * @throws NestedAccessorException
26
     */
27
    public static function get($source, $path, bool $strict = true)
28
    {
29
        return static::prepareAccessor($source)->get($path, $strict);
30
    }
31
32
    /**
33
     * Sets value to nested source by given path
34
     * @param array<scalar, mixed>|object $source source
35
     * @param string|array<string> $path path e.g. 'path.to.value' or ['path', 'to', 'value']
36
     * @param mixed $value value to set
37
     * @param bool $strict if true: throw exception when path is not found in source
38
     * @return void
39
     * @throws NestedAccessorException
40
     */
41
    public static function set(&$source, $path, $value, bool $strict = true): void
42
    {
43
        static::prepareAccessor($source)->set($path, $value, $strict);
44
    }
45
46
    /**
47
     * Appends value to nested source by given path
48
     * @param array<scalar, mixed>|object $source source
49
     * @param string|array<string> $path path e.g. 'path.to.value' or ['path', 'to', 'value']
50
     * @param mixed $value value to set
51
     * @param bool $strict if true: throw exception when path is not found in source
52
     * @return void
53
     * @throws NestedAccessorException
54
     */
55
    public static function append(&$source, $path, $value, bool $strict = true): void
56
    {
57
        static::prepareAccessor($source)->append($path, $value, $strict);
58
    }
59
60
    /**
61
     * Deletes value to nested source by given path
62
     * @param array<scalar, mixed>|object $source source
63
     * @param string|array<string> $path path e.g. 'path.to.value' or ['path', 'to', 'value']
64
     * @param bool $strict if true: throw exception when path is not found in source
65
     * @return void
66
     * @throws NestedAccessorException
67
     */
68
    public static function delete(&$source, $path, bool $strict = true): void
69
    {
70
        static::prepareAccessor($source)->delete($path, $strict);
71
    }
72
73
    /**
74
     * Returns true if path exists, false otherwise
75
     * @param array<scalar, mixed>|object $source source
76
     * @param string|string[] $path nested path
77
     * @return bool
78
     * @throws NestedAccessorException
79
     */
80
    public static function exist(&$source, $path): bool
81
    {
82
        return static::prepareAccessor($source)->exist($path);
83
    }
84
85
    /**
86
     * Returns true if path exists and not null, false otherwise
87
     * @param array<scalar, mixed>|object $source source
88
     * @param string|string[] $path nested path
89
     * @return bool
90
     * @throws NestedAccessorException
91
     */
92
    public static function isset(&$source, $path): bool
93
    {
94
        return static::prepareAccessor($source)->isset($path);
95
    }
96
97
    /**
98
     * Method for preparing accessor to use with source
99
     * @param array<scalar, mixed>|object $source source data
100
     * @return NestedAccessor
101
     * @throws NestedAccessorException
102
     */
103
    protected static function prepareAccessor(&$source): NestedAccessor
104
    {
105
        if(static::$accessor === null) {
106
            static::$accessor = new NestedAccessor($source);
107
        } else {
108
            static::$accessor->setSource($source);
109
        }
110
111
        return static::$accessor;
0 ignored issues
show
Bug Best Practice introduced by
The expression return static::accessor could return the type null which is incompatible with the type-hinted return Smoren\NestedAccessor\Components\NestedAccessor. Consider adding an additional type-check to rule them out.
Loading history...
112
    }
113
}
114