From 4cc86413261e79b5a65157ca4edf38e748ffbfe5 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Tue, 10 Sep 2019 11:11:45 +0200 Subject: [PATCH] [DI] fix Preloader --- .../DependencyInjection/Dumper/Preloader.php | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Symfony/Component/DependencyInjection/Dumper/Preloader.php b/src/Symfony/Component/DependencyInjection/Dumper/Preloader.php index eb3a69d70244d..8c2ab387f2121 100644 --- a/src/Symfony/Component/DependencyInjection/Dumper/Preloader.php +++ b/src/Symfony/Component/DependencyInjection/Dumper/Preloader.php @@ -38,8 +38,7 @@ public static function preload(array $classes) $prev = $classes; foreach ($classes as $c) { if (!isset($preloaded[$c])) { - $preloaded[$c] = true; - self::doPreload($c); + self::doPreload($c, $preloaded); } } $classes = array_merge(get_declared_classes(), get_declared_interfaces(), get_declared_traits()); @@ -49,12 +48,14 @@ public static function preload(array $classes) } } - private static function doPreload(string $class) + private static function doPreload(string $class, array &$preloaded) { - if (\in_array($class, ['self', 'static', 'parent'], true)) { + if (isset($preloaded[$class]) || \in_array($class, ['self', 'static', 'parent'], true)) { return; } + $preloaded[$class] = true; + try { $r = new \ReflectionClass($class); @@ -68,7 +69,7 @@ private static function doPreload(string $class) if (\PHP_VERSION_ID >= 70400) { foreach ($r->getProperties() as $p) { if (($t = $p->getType()) && !$t->isBuiltin()) { - self::doPreload($t->getName()); + self::doPreload($t->getName(), $preloaded); } } } @@ -79,17 +80,17 @@ private static function doPreload(string $class) $c = $p->getDefaultValueConstantName(); if ($i = strpos($c, '::')) { - self::doPreload(substr($c, 0, $i)); + self::doPreload(substr($c, 0, $i), $preloaded); } } if (($t = $p->getType()) && !$t->isBuiltin()) { - self::doPreload($t->getName()); + self::doPreload($t->getName(), $preloaded); } } if (($t = $m->getReturnType()) && !$t->isBuiltin()) { - self::doPreload($t->getName()); + self::doPreload($t->getName(), $preloaded); } } } catch (\ReflectionException $e) {