Chris@14
|
1 <?php
|
Chris@14
|
2 /*
|
Chris@14
|
3 * This file is part of Object Enumerator.
|
Chris@14
|
4 *
|
Chris@14
|
5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
|
Chris@14
|
6 *
|
Chris@14
|
7 * For the full copyright and license information, please view the LICENSE
|
Chris@14
|
8 * file that was distributed with this source code.
|
Chris@14
|
9 */
|
Chris@14
|
10
|
Chris@14
|
11 namespace SebastianBergmann\ObjectEnumerator;
|
Chris@14
|
12
|
Chris@14
|
13 use SebastianBergmann\ObjectReflector\ObjectReflector;
|
Chris@14
|
14 use SebastianBergmann\RecursionContext\Context;
|
Chris@14
|
15
|
Chris@14
|
16 /**
|
Chris@14
|
17 * Traverses array structures and object graphs
|
Chris@14
|
18 * to enumerate all referenced objects.
|
Chris@14
|
19 */
|
Chris@14
|
20 class Enumerator
|
Chris@14
|
21 {
|
Chris@14
|
22 /**
|
Chris@14
|
23 * Returns an array of all objects referenced either
|
Chris@14
|
24 * directly or indirectly by a variable.
|
Chris@14
|
25 *
|
Chris@14
|
26 * @param array|object $variable
|
Chris@14
|
27 *
|
Chris@14
|
28 * @return object[]
|
Chris@14
|
29 */
|
Chris@14
|
30 public function enumerate($variable)
|
Chris@14
|
31 {
|
Chris@14
|
32 if (!is_array($variable) && !is_object($variable)) {
|
Chris@14
|
33 throw new InvalidArgumentException;
|
Chris@14
|
34 }
|
Chris@14
|
35
|
Chris@14
|
36 if (isset(func_get_args()[1])) {
|
Chris@14
|
37 if (!func_get_args()[1] instanceof Context) {
|
Chris@14
|
38 throw new InvalidArgumentException;
|
Chris@14
|
39 }
|
Chris@14
|
40
|
Chris@14
|
41 $processed = func_get_args()[1];
|
Chris@14
|
42 } else {
|
Chris@14
|
43 $processed = new Context;
|
Chris@14
|
44 }
|
Chris@14
|
45
|
Chris@14
|
46 $objects = [];
|
Chris@14
|
47
|
Chris@14
|
48 if ($processed->contains($variable)) {
|
Chris@14
|
49 return $objects;
|
Chris@14
|
50 }
|
Chris@14
|
51
|
Chris@14
|
52 $array = $variable;
|
Chris@14
|
53 $processed->add($variable);
|
Chris@14
|
54
|
Chris@14
|
55 if (is_array($variable)) {
|
Chris@14
|
56 foreach ($array as $element) {
|
Chris@14
|
57 if (!is_array($element) && !is_object($element)) {
|
Chris@14
|
58 continue;
|
Chris@14
|
59 }
|
Chris@14
|
60
|
Chris@14
|
61 $objects = array_merge(
|
Chris@14
|
62 $objects,
|
Chris@14
|
63 $this->enumerate($element, $processed)
|
Chris@14
|
64 );
|
Chris@14
|
65 }
|
Chris@14
|
66 } else {
|
Chris@14
|
67 $objects[] = $variable;
|
Chris@14
|
68
|
Chris@14
|
69 $reflector = new ObjectReflector;
|
Chris@14
|
70
|
Chris@14
|
71 foreach ($reflector->getAttributes($variable) as $value) {
|
Chris@14
|
72 if (!is_array($value) && !is_object($value)) {
|
Chris@14
|
73 continue;
|
Chris@14
|
74 }
|
Chris@14
|
75
|
Chris@14
|
76 $objects = array_merge(
|
Chris@14
|
77 $objects,
|
Chris@14
|
78 $this->enumerate($value, $processed)
|
Chris@14
|
79 );
|
Chris@14
|
80 }
|
Chris@14
|
81 }
|
Chris@14
|
82
|
Chris@14
|
83 return $objects;
|
Chris@14
|
84 }
|
Chris@14
|
85 }
|