Completed
Push — master ( 4f4b82...1c4c30 )
by Joshua
01:53
created

src/MemoizingModel.php (1 issue)

Severity

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
/**
3
 * This file is part of the Jrumbut.EloquentMemoize
4
 *
5
 * @license http://opensource.org/licenses/MIT MIT
6
 */
7
namespace Jrumbut\EloquentMemoize;
8
9
use Illuminate\Database\Eloquent\Model;
10
11
class MemoizingModel extends Model
12
{
13
    /**
14
    * List of attributes to be memoized
15
    *
16
    * @var Array
17
    */
18
    protected static $memoized = [];
19
20
    /**
21
    * Structure where memoized attributes are stored
22
    *
23
    * @var Array
24
    */
25
    protected $memoized_values = [];
26
27
    /**
28
    * Is memoizing enabled?
29
    *
30
    * @var bool
31
    */
32
    protected static $memoizing_enabled = true;
33
34
    /**
35
    * See if attribute has been memoized, and if so return it, else do
36
    * parent procedure for getting attribute
37
    *
38
    * @param string $key
39
    * @return mixed $value
40
    */
41
    public function getAttribute($key)
42
    {
43
        $value = null;
0 ignored issues
show
$value is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
44
45
        if ($this->shouldBeMemoized($key)) {
46
            if (array_key_exists($key, $this->memoized_values)) {
47
                $value = $this->memoized_values[$key];
48
            } else {
49
                $value = parent::getAttribute($key);
50
                $this->memoizeAttribute($key, $value);
51
            }
52
        } else {
53
            $value = parent::getAttribute($key);
54
        }
55
56
        return $value;
57
    }
58
59
    /**
60
    * Set (and clear memoized value for) a given attribute on the model.
61
    *
62
    * @param string $key
63
    * @param mixed  $value
64
    * @return $this
65
    */
66 4
    public function setAttribute($key, $value)
67
    {
68
        // Remove the old value, no one wants it anymore
69 4
        if (array_key_exists($key, $this->memoized_values)) {
70
            unset($this->memoized_values[$key]);
71
        }
72
73 4
        return parent::setAttribute($key, $value);
74
    }
75
76
    /**
77
     * Memoize attributes
78
     *
79
     * @param string $key
80
     * @param mixed  $value
81
     */
82
    public function memoizeAttribute($key, $value)
83
    {
84
        $this->memoized_values[$key] = $value;
85
    }
86
87
    /**
88
    * Get the memoized attributes for the model.
89
    *
90
    * @return array
91
    */
92 3
    public function getMemoized()
93
    {
94 3
        return static::$memoized;
95
    }
96
97
    /**
98
    * Set the memoized attributes for the model.
99
    *
100
    * @param array $memoized
101
    * @return $this
102
    */
103 2
    public static function setMemoized(array $memoized)
104
    {
105 2
        static::$memoized = $memoized;
106 2
    }
107
108
    /**
109
    * Disable all memoization.
110
    *
111
    * @param bool $state
112
    * @return void
113
    */
114
    public static function disableMemoization($state = false)
115
    {
116
        static::$memoizing_enabled = $state;
117
    }
118
119
    /**
120
    * Enable memoization.
121
    *
122
    * @return void
123
    */
124
    public static function enableMemoization()
125
    {
126
        static::$memoizing_enabled = true;
127
    }
128
129
    /**
130
     * Check if attribute should be memoized
131
     *
132
     * @param string $key
133
     * @return bool should_be_memoized
134
     */
135 2
    public function shouldBeMemoized($key)
136
    {
137 2
        $memoized = $this->getMemoized();
138 2
        return (in_array($key, $memoized) || $memoized == ['*'])  && static::$memoizing_enabled;
139
    }
140
}
141