Mercurial > hg > isophonics-drupal-site
comparison vendor/zendframework/zend-stdlib/src/ArrayObject.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 7a779792577d |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4c8ae668cc8c |
---|---|
1 <?php | |
2 /** | |
3 * Zend Framework (http://framework.zend.com/) | |
4 * | |
5 * @link http://github.com/zendframework/zf2 for the canonical source repository | |
6 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) | |
7 * @license http://framework.zend.com/license/new-bsd New BSD License | |
8 */ | |
9 | |
10 namespace Zend\Stdlib; | |
11 | |
12 use ArrayAccess; | |
13 use Countable; | |
14 use IteratorAggregate; | |
15 use Serializable; | |
16 | |
17 /** | |
18 * Custom framework ArrayObject implementation | |
19 * | |
20 * Extends version-specific "abstract" implementation. | |
21 */ | |
22 class ArrayObject implements IteratorAggregate, ArrayAccess, Serializable, Countable | |
23 { | |
24 /** | |
25 * Properties of the object have their normal functionality | |
26 * when accessed as list (var_dump, foreach, etc.). | |
27 */ | |
28 const STD_PROP_LIST = 1; | |
29 | |
30 /** | |
31 * Entries can be accessed as properties (read and write). | |
32 */ | |
33 const ARRAY_AS_PROPS = 2; | |
34 | |
35 /** | |
36 * @var array | |
37 */ | |
38 protected $storage; | |
39 | |
40 /** | |
41 * @var int | |
42 */ | |
43 protected $flag; | |
44 | |
45 /** | |
46 * @var string | |
47 */ | |
48 protected $iteratorClass; | |
49 | |
50 /** | |
51 * @var array | |
52 */ | |
53 protected $protectedProperties; | |
54 | |
55 /** | |
56 * Constructor | |
57 * | |
58 * @param array $input | |
59 * @param int $flags | |
60 * @param string $iteratorClass | |
61 */ | |
62 public function __construct($input = [], $flags = self::STD_PROP_LIST, $iteratorClass = 'ArrayIterator') | |
63 { | |
64 $this->setFlags($flags); | |
65 $this->storage = $input; | |
66 $this->setIteratorClass($iteratorClass); | |
67 $this->protectedProperties = array_keys(get_object_vars($this)); | |
68 } | |
69 | |
70 /** | |
71 * Returns whether the requested key exists | |
72 * | |
73 * @param mixed $key | |
74 * @return bool | |
75 */ | |
76 public function __isset($key) | |
77 { | |
78 if ($this->flag == self::ARRAY_AS_PROPS) { | |
79 return $this->offsetExists($key); | |
80 } | |
81 if (in_array($key, $this->protectedProperties)) { | |
82 throw new Exception\InvalidArgumentException('$key is a protected property, use a different key'); | |
83 } | |
84 | |
85 return isset($this->$key); | |
86 } | |
87 | |
88 /** | |
89 * Sets the value at the specified key to value | |
90 * | |
91 * @param mixed $key | |
92 * @param mixed $value | |
93 * @return void | |
94 */ | |
95 public function __set($key, $value) | |
96 { | |
97 if ($this->flag == self::ARRAY_AS_PROPS) { | |
98 return $this->offsetSet($key, $value); | |
99 } | |
100 if (in_array($key, $this->protectedProperties)) { | |
101 throw new Exception\InvalidArgumentException('$key is a protected property, use a different key'); | |
102 } | |
103 $this->$key = $value; | |
104 } | |
105 | |
106 /** | |
107 * Unsets the value at the specified key | |
108 * | |
109 * @param mixed $key | |
110 * @return void | |
111 */ | |
112 public function __unset($key) | |
113 { | |
114 if ($this->flag == self::ARRAY_AS_PROPS) { | |
115 return $this->offsetUnset($key); | |
116 } | |
117 if (in_array($key, $this->protectedProperties)) { | |
118 throw new Exception\InvalidArgumentException('$key is a protected property, use a different key'); | |
119 } | |
120 unset($this->$key); | |
121 } | |
122 | |
123 /** | |
124 * Returns the value at the specified key by reference | |
125 * | |
126 * @param mixed $key | |
127 * @return mixed | |
128 */ | |
129 public function &__get($key) | |
130 { | |
131 $ret = null; | |
132 if ($this->flag == self::ARRAY_AS_PROPS) { | |
133 $ret =& $this->offsetGet($key); | |
134 | |
135 return $ret; | |
136 } | |
137 if (in_array($key, $this->protectedProperties)) { | |
138 throw new Exception\InvalidArgumentException('$key is a protected property, use a different key'); | |
139 } | |
140 | |
141 return $this->$key; | |
142 } | |
143 | |
144 /** | |
145 * Appends the value | |
146 * | |
147 * @param mixed $value | |
148 * @return void | |
149 */ | |
150 public function append($value) | |
151 { | |
152 $this->storage[] = $value; | |
153 } | |
154 | |
155 /** | |
156 * Sort the entries by value | |
157 * | |
158 * @return void | |
159 */ | |
160 public function asort() | |
161 { | |
162 asort($this->storage); | |
163 } | |
164 | |
165 /** | |
166 * Get the number of public properties in the ArrayObject | |
167 * | |
168 * @return int | |
169 */ | |
170 public function count() | |
171 { | |
172 return count($this->storage); | |
173 } | |
174 | |
175 /** | |
176 * Exchange the array for another one. | |
177 * | |
178 * @param array|ArrayObject $data | |
179 * @return array | |
180 */ | |
181 public function exchangeArray($data) | |
182 { | |
183 if (!is_array($data) && !is_object($data)) { | |
184 throw new Exception\InvalidArgumentException('Passed variable is not an array or object, using empty array instead'); | |
185 } | |
186 | |
187 if (is_object($data) && ($data instanceof self || $data instanceof \ArrayObject)) { | |
188 $data = $data->getArrayCopy(); | |
189 } | |
190 if (!is_array($data)) { | |
191 $data = (array) $data; | |
192 } | |
193 | |
194 $storage = $this->storage; | |
195 | |
196 $this->storage = $data; | |
197 | |
198 return $storage; | |
199 } | |
200 | |
201 /** | |
202 * Creates a copy of the ArrayObject. | |
203 * | |
204 * @return array | |
205 */ | |
206 public function getArrayCopy() | |
207 { | |
208 return $this->storage; | |
209 } | |
210 | |
211 /** | |
212 * Gets the behavior flags. | |
213 * | |
214 * @return int | |
215 */ | |
216 public function getFlags() | |
217 { | |
218 return $this->flag; | |
219 } | |
220 | |
221 /** | |
222 * Create a new iterator from an ArrayObject instance | |
223 * | |
224 * @return \Iterator | |
225 */ | |
226 public function getIterator() | |
227 { | |
228 $class = $this->iteratorClass; | |
229 | |
230 return new $class($this->storage); | |
231 } | |
232 | |
233 /** | |
234 * Gets the iterator classname for the ArrayObject. | |
235 * | |
236 * @return string | |
237 */ | |
238 public function getIteratorClass() | |
239 { | |
240 return $this->iteratorClass; | |
241 } | |
242 | |
243 /** | |
244 * Sort the entries by key | |
245 * | |
246 * @return void | |
247 */ | |
248 public function ksort() | |
249 { | |
250 ksort($this->storage); | |
251 } | |
252 | |
253 /** | |
254 * Sort an array using a case insensitive "natural order" algorithm | |
255 * | |
256 * @return void | |
257 */ | |
258 public function natcasesort() | |
259 { | |
260 natcasesort($this->storage); | |
261 } | |
262 | |
263 /** | |
264 * Sort entries using a "natural order" algorithm | |
265 * | |
266 * @return void | |
267 */ | |
268 public function natsort() | |
269 { | |
270 natsort($this->storage); | |
271 } | |
272 | |
273 /** | |
274 * Returns whether the requested key exists | |
275 * | |
276 * @param mixed $key | |
277 * @return bool | |
278 */ | |
279 public function offsetExists($key) | |
280 { | |
281 return isset($this->storage[$key]); | |
282 } | |
283 | |
284 /** | |
285 * Returns the value at the specified key | |
286 * | |
287 * @param mixed $key | |
288 * @return mixed | |
289 */ | |
290 public function &offsetGet($key) | |
291 { | |
292 $ret = null; | |
293 if (!$this->offsetExists($key)) { | |
294 return $ret; | |
295 } | |
296 $ret =& $this->storage[$key]; | |
297 | |
298 return $ret; | |
299 } | |
300 | |
301 /** | |
302 * Sets the value at the specified key to value | |
303 * | |
304 * @param mixed $key | |
305 * @param mixed $value | |
306 * @return void | |
307 */ | |
308 public function offsetSet($key, $value) | |
309 { | |
310 $this->storage[$key] = $value; | |
311 } | |
312 | |
313 /** | |
314 * Unsets the value at the specified key | |
315 * | |
316 * @param mixed $key | |
317 * @return void | |
318 */ | |
319 public function offsetUnset($key) | |
320 { | |
321 if ($this->offsetExists($key)) { | |
322 unset($this->storage[$key]); | |
323 } | |
324 } | |
325 | |
326 /** | |
327 * Serialize an ArrayObject | |
328 * | |
329 * @return string | |
330 */ | |
331 public function serialize() | |
332 { | |
333 return serialize(get_object_vars($this)); | |
334 } | |
335 | |
336 /** | |
337 * Sets the behavior flags | |
338 * | |
339 * @param int $flags | |
340 * @return void | |
341 */ | |
342 public function setFlags($flags) | |
343 { | |
344 $this->flag = $flags; | |
345 } | |
346 | |
347 /** | |
348 * Sets the iterator classname for the ArrayObject | |
349 * | |
350 * @param string $class | |
351 * @return void | |
352 */ | |
353 public function setIteratorClass($class) | |
354 { | |
355 if (class_exists($class)) { | |
356 $this->iteratorClass = $class; | |
357 | |
358 return ; | |
359 } | |
360 | |
361 if (strpos($class, '\\') === 0) { | |
362 $class = '\\' . $class; | |
363 if (class_exists($class)) { | |
364 $this->iteratorClass = $class; | |
365 | |
366 return ; | |
367 } | |
368 } | |
369 | |
370 throw new Exception\InvalidArgumentException('The iterator class does not exist'); | |
371 } | |
372 | |
373 /** | |
374 * Sort the entries with a user-defined comparison function and maintain key association | |
375 * | |
376 * @param callable $function | |
377 * @return void | |
378 */ | |
379 public function uasort($function) | |
380 { | |
381 if (is_callable($function)) { | |
382 uasort($this->storage, $function); | |
383 } | |
384 } | |
385 | |
386 /** | |
387 * Sort the entries by keys using a user-defined comparison function | |
388 * | |
389 * @param callable $function | |
390 * @return void | |
391 */ | |
392 public function uksort($function) | |
393 { | |
394 if (is_callable($function)) { | |
395 uksort($this->storage, $function); | |
396 } | |
397 } | |
398 | |
399 /** | |
400 * Unserialize an ArrayObject | |
401 * | |
402 * @param string $data | |
403 * @return void | |
404 */ | |
405 public function unserialize($data) | |
406 { | |
407 $ar = unserialize($data); | |
408 $this->protectedProperties = array_keys(get_object_vars($this)); | |
409 | |
410 $this->setFlags($ar['flag']); | |
411 $this->exchangeArray($ar['storage']); | |
412 $this->setIteratorClass($ar['iteratorClass']); | |
413 | |
414 foreach ($ar as $k => $v) { | |
415 switch ($k) { | |
416 case 'flag': | |
417 $this->setFlags($v); | |
418 break; | |
419 case 'storage': | |
420 $this->exchangeArray($v); | |
421 break; | |
422 case 'iteratorClass': | |
423 $this->setIteratorClass($v); | |
424 break; | |
425 case 'protectedProperties': | |
426 continue; | |
427 default: | |
428 $this->__set($k, $v); | |
429 } | |
430 } | |
431 } | |
432 } |