PluginProbe
Boxzilla – WordPress Popup Builder / 3.2
Boxzilla – WordPress Popup Builder v3.2
3.4.11 3.4.10 3.4.9 3.4.3 3.4.4 3.4.5 3.4.6 3.4.7 3.4.8 trunk 3.0 3.0.1 3.0.2 3.0.3 3.1 3.1.1 3.1.10 3.1.11 3.1.12 3.1.13 3.1.14 3.1.15 3.1.16 3.1.17 3.1.18 All 72 releases
← All changes | src/di/class-container.php +218 -193 trunk3.2 View file →
@@ -1,8 +1,8 @@
1 1 <?php
2 -// phpcs:ignoreFile
2 +
3 3 /*
4 - * This is a modified version of Pimple, a dependency injection container for PHP originally developed by Fabien Potencier.
4 + * This file is part of Pimple.
5 5 *
6 6 * Copyright (c) 2009 Fabien Potencier
7 7 *
8 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -30,227 +30,252 @@
30 30 * Container main class.
31 31 *
32 32 * @author Fabien Potencier
33 33 */
34 -class Container implements \ArrayAccess {
34 +class Container implements \ArrayAccess
35 +{
36 + private $values = array();
37 + private $factories;
38 + private $protected;
39 + private $frozen = array();
40 + private $raw = array();
41 + private $keys = array();
35 42
36 - private $values = array();
37 - private $factories;
38 - private $protected;
39 - private $frozen = array();
40 - private $raw = array();
41 - private $keys = array();
43 + /**
44 + * Instantiate the container.
45 + *
46 + * Objects and parameters can be passed as argument to the constructor.
47 + *
48 + * @param array $values The parameters or objects.
49 + */
50 + public function __construct(array $values = array())
51 + {
52 + $this->factories = new \SplObjectStorage();
53 + $this->protected = new \SplObjectStorage();
42 54
43 - /**
44 - * Instantiate the container.
45 - *
46 - * Objects and parameters can be passed as argument to the constructor.
47 - *
48 - * @param array $values The parameters or objects.
49 - */
50 - public function __construct( array $values = array() ) {
51 - $this->factories = new \SplObjectStorage();
52 - $this->protected = new \SplObjectStorage();
55 + foreach ($values as $key => $value) {
56 + $this->offsetSet($key, $value);
57 + }
58 + }
53 59
54 - foreach ( $values as $key => $value ) {
55 - $this->offsetSet( $key, $value );
56 - }
57 - }
60 + /**
61 + * Sets a parameter or an object.
62 + *
63 + * Objects must be defined as Closures.
64 + *
65 + * Allowing any PHP callable leads to difficult to debug problems
66 + * as function names (strings) are callable (creating a function with
67 + * the same name as an existing parameter would break your container).
68 + *
69 + * @param string $id The unique identifier for the parameter or object
70 + * @param mixed $value The value of the parameter or a closure to define an object
71 + * @throws \RuntimeException Prevent override of a frozen service
72 + */
73 + public function offsetSet($id, $value)
74 + {
75 + if (isset($this->frozen[$id])) {
76 + throw new \RuntimeException(sprintf('Cannot override frozen service "%s".', $id));
77 + }
58 78
59 - /**
60 - * Sets a parameter or an object.
61 - *
62 - * Objects must be defined as Closures.
63 - *
64 - * Allowing any PHP callable leads to difficult to debug problems
65 - * as function names (strings) are callable (creating a function with
66 - * the same name as an existing parameter would break your container).
67 - *
68 - * @param string $id The unique identifier for the parameter or object
69 - * @param mixed $value The value of the parameter or a closure to define an object
70 - * @throws \RuntimeException Prevent override of a frozen service
71 - */
72 - #[\ReturnTypeWillChange]
73 - public function offsetSet( $id, $value ) {
74 - if ( isset( $this->frozen[ $id ] ) ) {
75 - throw new \RuntimeException( sprintf( 'Cannot override frozen service "%s".', $id ) );
76 - }
79 + $this->values[$id] = $value;
80 + $this->keys[$id] = true;
81 + }
77 82
78 - $this->values[ $id ] = $value;
79 - $this->keys[ $id ] = true;
80 - }
83 + /**
84 + * Gets a parameter or an object.
85 + *
86 + * @param string $id The unique identifier for the parameter or object
87 + *
88 + * @return mixed The value of the parameter or an object
89 + *
90 + * @throws \InvalidArgumentException if the identifier is not defined
91 + */
92 + public function offsetGet($id)
93 + {
94 + if (!isset($this->keys[$id])) {
95 + throw new \InvalidArgumentException(sprintf('Identifier "%s" is not defined.', $id));
96 + }
81 97
82 - /**
83 - * Gets a parameter or an object.
84 - *
85 - * @param string $id The unique identifier for the parameter or object
86 - *
87 - * @return mixed The value of the parameter or an object
88 - *
89 - * @throws \InvalidArgumentException if the identifier is not defined
90 - */
91 - #[\ReturnTypeWillChange]
92 - public function offsetGet( $id ) {
93 - if ( ! isset( $this->keys[ $id ] ) ) {
94 - throw new \InvalidArgumentException( sprintf( 'Identifier "%s" is not defined.', $id ) );
95 - }
98 + if (
99 + isset($this->raw[$id])
100 + || !is_object($this->values[$id])
101 + || isset($this->protected[$this->values[$id]])
102 + || !method_exists($this->values[$id], '__invoke')
103 + ) {
104 + return $this->values[$id];
105 + }
96 106
97 - if (
98 - isset( $this->raw[ $id ] )
99 - || ! is_object( $this->values[ $id ] )
100 - || isset( $this->protected[ $this->values[ $id ] ] )
101 - || ! method_exists( $this->values[ $id ], '__invoke' )
102 - ) {
103 - return $this->values[ $id ];
104 - }
107 + if (isset($this->factories[$this->values[$id]])) {
108 + return $this->values[$id]($this);
109 + }
105 110
106 - if ( isset( $this->factories[ $this->values[ $id ] ] ) ) {
107 - return $this->values[ $id ]($this);
108 - }
111 + $raw = $this->values[$id];
112 + $val = $this->values[$id] = $raw($this);
113 + $this->raw[$id] = $raw;
109 114
110 - $raw = $this->values[ $id ];
111 - $val = $this->values[ $id ] = $raw( $this );
112 - $this->raw[ $id ] = $raw;
115 + $this->frozen[$id] = true;
113 116
114 - $this->frozen[ $id ] = true;
117 + return $val;
118 + }
115 119
116 - return $val;
117 - }
120 + /**
121 + * Checks if a parameter or an object is set.
122 + *
123 + * @param string $id The unique identifier for the parameter or object
124 + *
125 + * @return bool
126 + */
127 + public function offsetExists($id)
128 + {
129 + return isset($this->keys[$id]);
130 + }
118 131
119 - /**
120 - * Checks if a parameter or an object is set.
121 - *
122 - * @param string $id The unique identifier for the parameter or object
123 - *
124 - * @return bool
125 - */
126 - #[\ReturnTypeWillChange]
127 - public function offsetExists( $id ) {
128 - return isset( $this->keys[ $id ] );
129 - }
132 + /**
133 + * Unsets a parameter or an object.
134 + *
135 + * @param string $id The unique identifier for the parameter or object
136 + */
137 + public function offsetUnset($id)
138 + {
139 + if (isset($this->keys[$id])) {
140 + if (is_object($this->values[$id])) {
141 + unset($this->factories[$this->values[$id]], $this->protected[$this->values[$id]]);
142 + }
130 143
131 - /**
132 - * Unsets a parameter or an object.
133 - *
134 - * @param string $id The unique identifier for the parameter or object
135 - */
136 - #[\ReturnTypeWillChange]
137 - public function offsetUnset( $id ) {
138 - if ( isset( $this->keys[ $id ] ) ) {
139 - if ( is_object( $this->values[ $id ] ) ) {
140 - unset( $this->factories[ $this->values[ $id ] ], $this->protected[ $this->values[ $id ] ] );
141 - }
144 + unset($this->values[$id], $this->frozen[$id], $this->raw[$id], $this->keys[$id]);
145 + }
146 + }
142 147
143 - unset( $this->values[ $id ], $this->frozen[ $id ], $this->raw[ $id ], $this->keys[ $id ] );
144 - }
145 - }
148 + /**
149 + * Marks a callable as being a factory service.
150 + *
151 + * @param callable $callable A service definition to be used as a factory
152 + *
153 + * @return callable The passed callable
154 + *
155 + * @throws \InvalidArgumentException Service definition has to be a closure of an invokable object
156 + */
157 + public function factory($callable)
158 + {
159 + if (!is_object($callable) || !method_exists($callable, '__invoke')) {
160 + throw new \InvalidArgumentException('Service definition is not a Closure or invokable object.');
161 + }
146 162
147 - /**
148 - * Marks a callable as being a factory service.
149 - *
150 - * @param callable $callable A service definition to be used as a factory
151 - *
152 - * @return callable The passed callable
153 - *
154 - * @throws \InvalidArgumentException Service definition has to be a closure of an invokable object
155 - */
156 - public function factory( $callable ) {
157 - if ( ! is_object( $callable ) || ! method_exists( $callable, '__invoke' ) ) {
158 - throw new \InvalidArgumentException( 'Service definition is not a Closure or invokable object.' );
159 - }
163 + $this->factories->attach($callable);
160 164
161 - $this->factories->attach( $callable );
165 + return $callable;
166 + }
162 167
163 - return $callable;
164 - }
168 + /**
169 + * Protects a callable from being interpreted as a service.
170 + *
171 + * This is useful when you want to store a callable as a parameter.
172 + *
173 + * @param callable $callable A callable to protect from being evaluated
174 + *
175 + * @return callable The passed callable
176 + *
177 + * @throws \InvalidArgumentException Service definition has to be a closure of an invokable object
178 + */
179 + public function protect($callable)
180 + {
181 + if (!is_object($callable) || !method_exists($callable, '__invoke')) {
182 + throw new \InvalidArgumentException('Callable is not a Closure or invokable object.');
183 + }
165 184
166 - /**
167 - * Protects a callable from being interpreted as a service.
168 - *
169 - * This is useful when you want to store a callable as a parameter.
170 - *
171 - * @param callable $callable A callable to protect from being evaluated
172 - *
173 - * @return callable The passed callable
174 - *
175 - * @throws \InvalidArgumentException Service definition has to be a closure of an invokable object
176 - */
177 - public function protect( $callable ) {
178 - if ( ! is_object( $callable ) || ! method_exists( $callable, '__invoke' ) ) {
179 - throw new \InvalidArgumentException( 'Callable is not a Closure or invokable object.' );
180 - }
185 + $this->protected->attach($callable);
181 186
182 - $this->protected->attach( $callable );
187 + return $callable;
188 + }
183 189
184 - return $callable;
185 - }
190 + /**
191 + * Gets a parameter or the closure defining an object.
192 + *
193 + * @param string $id The unique identifier for the parameter or object
194 + *
195 + * @return mixed The value of the parameter or the closure defining an object
196 + *
197 + * @throws \InvalidArgumentException if the identifier is not defined
198 + */
199 + public function raw($id)
200 + {
201 + if (!isset($this->keys[$id])) {
202 + throw new \InvalidArgumentException(sprintf('Identifier "%s" is not defined.', $id));
203 + }
186 204
187 - /**
188 - * Gets a parameter or the closure defining an object.
189 - *
190 - * @param string $id The unique identifier for the parameter or object
191 - *
192 - * @return mixed The value of the parameter or the closure defining an object
193 - *
194 - * @throws \InvalidArgumentException if the identifier is not defined
195 - */
196 - public function raw( $id ) {
197 - if ( ! isset( $this->keys[ $id ] ) ) {
198 - throw new \InvalidArgumentException( sprintf( 'Identifier "%s" is not defined.', $id ) );
199 - }
205 + if (isset($this->raw[$id])) {
206 + return $this->raw[$id];
207 + }
200 208
201 - if ( isset( $this->raw[ $id ] ) ) {
202 - return $this->raw[ $id ];
203 - }
209 + return $this->values[$id];
210 + }
204 211
205 - return $this->values[ $id ];
206 - }
212 + /**
213 + * Extends an object definition.
214 + *
215 + * Useful when you want to extend an existing object definition,
216 + * without necessarily loading that object.
217 + *
218 + * @param string $id The unique identifier for the object
219 + * @param callable $callable A service definition to extend the original
220 + *
221 + * @return callable The wrapped callable
222 + *
223 + * @throws \InvalidArgumentException if the identifier is not defined or not a service definition
224 + */
225 + public function extend($id, $callable)
226 + {
227 + if (!isset($this->keys[$id])) {
228 + throw new \InvalidArgumentException(sprintf('Identifier "%s" is not defined.', $id));
229 + }
207 230
208 - /**
209 - * Extends an object definition.
210 - *
211 - * Useful when you want to extend an existing object definition,
212 - * without necessarily loading that object.
213 - *
214 - * @param string $id The unique identifier for the object
215 - * @param callable $callable A service definition to extend the original
216 - *
217 - * @return callable The wrapped callable
218 - *
219 - * @throws \InvalidArgumentException if the identifier is not defined or not a service definition
220 - */
221 - public function extend( $id, $callable ) {
222 - if ( ! isset( $this->keys[ $id ] ) ) {
223 - throw new \InvalidArgumentException( sprintf( 'Identifier "%s" is not defined.', $id ) );
224 - }
231 + if (!is_object($this->values[$id]) || !method_exists($this->values[$id], '__invoke')) {
232 + throw new \InvalidArgumentException(sprintf('Identifier "%s" does not contain an object definition.', $id));
233 + }
225 234
226 - if ( ! is_object( $this->values[ $id ] ) || ! method_exists( $this->values[ $id ], '__invoke' ) ) {
227 - throw new \InvalidArgumentException( sprintf( 'Identifier "%s" does not contain an object definition.', $id ) );
228 - }
235 + if (!is_object($callable) || !method_exists($callable, '__invoke')) {
236 + throw new \InvalidArgumentException('Extension service definition is not a Closure or invokable object.');
237 + }
229 238
230 - if ( ! is_object( $callable ) || ! method_exists( $callable, '__invoke' ) ) {
231 - throw new \InvalidArgumentException( 'Extension service definition is not a Closure or invokable object.' );
232 - }
239 + $factory = $this->values[$id];
233 240
234 - $factory = $this->values[ $id ];
241 + $extended = function ($c) use ($callable, $factory) {
242 + return $callable($factory($c), $c);
243 + };
235 244
236 - $extended = function ( $c ) use ( $callable, $factory ) {
237 - return $callable( $factory( $c ), $c );
238 - };
245 + if (isset($this->factories[$factory])) {
246 + $this->factories->detach($factory);
247 + $this->factories->attach($extended);
248 + }
239 249
240 - if ( isset( $this->factories[ $factory ] ) ) {
241 - $this->factories->detach( $factory );
242 - $this->factories->attach( $extended );
243 - }
250 + return $this[$id] = $extended;
251 + }
244 252
245 - return $this[ $id ] = $extended;
246 - }
253 + /**
254 + * Returns all defined value names.
255 + *
256 + * @return array An array of value names
257 + */
258 + public function keys()
259 + {
260 + return array_keys($this->values);
261 + }
247 262
248 - /**
249 - * Returns all defined value names.
250 - *
251 - * @return array An array of value names
252 - */
253 - public function keys() {
254 - return array_keys( $this->values );
255 - }
263 + /**
264 + * Registers a service provider.
265 + *
266 + * @param ServiceProviderInterface $provider A ServiceProviderInterface instance
267 + * @param array $values An array of values that customizes the provider
268 + *
269 + * @return static
270 + */
271 + public function register(ServiceProviderInterface $provider, array $values = array())
272 + {
273 + $provider->register($this);
274 +
275 + foreach ($values as $key => $value) {
276 + $this[$key] = $value;
277 + }
278 +
279 + return $this;
280 + }
256 281 }