annotate vendor/sebastian/object-enumerator/src/Enumerator.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 1fec387a4317
children
rev   line source
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 }