-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathContainer.php
174 lines (158 loc) · 4.27 KB
/
Container.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
<?php
namespace WebStream\Container;
use WebStream\Exception\Extend\InvalidArgumentException;
/**
* Containerクラス
* @author Ryuichi TANAKA.
* @since 2013/01/12
* @version 0.4
*/
class Container
{
/**
* @var array<string> パラメータMap
*/
protected $values = [];
/**
* @var bool strict container flag
*/
private $isStrict;
/**
* {@inheritdoc}
*/
public function __construct($isStrict = true)
{
$this->isStrict = $isStrict;
}
/**
* magic method of set
* @param string $key キー
* @param mixed $value 値
* @return void
*/
public function __set($key, $value)
{
if ($value instanceof \Closure) {
call_user_func_array([$this, 'registerAsLazy'], [$key, $value]);
} else {
$this->set($key, $value);
}
}
/**
* magic method of get
* @param string $key キー
* @return mixed 値
*/
public function __get($key)
{
return $this->get($key);
}
/**
* 未定義のメソッドを処理
* @param string $name メソッド名
* @param array $arguments 引数リスト
* @return void
*/
public function __call($name, $arguments)
{
if ($arguments[0] instanceof \Closure) {
array_unshift($arguments, $name);
call_user_func_array([$this, 'registerAsLazy'], $arguments);
} else {
$this->set($name, $arguments[0]);
}
}
/**
* キーの値を設定する
* @param string $name メソッド名
* @param array $arguments 引数リスト
* @return void
*/
public function set($key, $value)
{
$this->values[$key] = $value;
}
/**
* 格納した値を取得
* @param string $key キー
* @throws InvalidArgumentException 引数例外
* @return mixed 格納値
*/
public function get($key)
{
if (!isset($this->values[$key])) {
if ($this->isStrict) {
throw new InvalidArgumentException("The value of the specified key does not exist: $key");
} else {
return null;
}
}
if ($this->values[$key] instanceof ValueProxy) {
return $this->values[$key]->fetch();
} else {
return $this->values[$key];
}
}
/**
* 要素の格納数を返却するを設定する
* @return integer 格納数
*/
public function length()
{
return count($this->values);
}
/**
* 格納された値を削除する
* @param string $key キー
* @return void
*/
public function remove($key)
{
unset($this->values[$key]);
}
/**
* 値を登録する
* @param string $key キー
* @param string $value 値
* @return void
*/
public function register($key, $value)
{
$this->set($key, $value);
}
/**
* 即時実行した値を登録する
* @param string $key キー
* @param callable $callback クロージャ
* @param array $context クロージャの引数リスト
* @return void
*/
public function registerAsDynamic($key, $callback, $context = [])
{
$valueObject = new ValueProxy($callback, $context, true);
$this->values[$key] = $valueObject->fetch();
}
/**
* 遅延評価の値を登録する
* @param string $key キー
* @param callable $callback クロージャ
* @param array $context クロージャの引数リスト
* @return void
*/
public function registerAsLazy($key, $callback, $context = [])
{
$this->values[$key] = new ValueProxy($callback, $context, true);
}
/**
* 遅延評価の値を登録する
* 繰り返し実行されたときにキャッシュしない
* @param string $key キー
* @param callable $callback クロージャ
* @param array $context クロージャの引数リスト
* @return void
*/
public function registerAsLazyUnCached($key, $callback, $context = [])
{
$this->values[$key] = new ValueProxy($callback, $context, false);
}
}