annotate vendor/sebastian/object-enumerator/src/Enumerator.php @ 2:5311817fb629

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