From abff242bf43d7d5889e7fc541c9fbbf251f72a04 Mon Sep 17 00:00:00 2001 From: tianfenghan Date: Thu, 9 Apr 2026 16:24:41 +0800 Subject: [PATCH] =?UTF-8?q?refactor(Php):=20=E7=A7=BB=E9=99=A4=E5=BE=AA?= =?UTF-8?q?=E7=8E=AF=E4=BE=9D=E8=B5=96=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除了 CircularDependencyException 的捕获和处理代码 - 移除了 resolveCircularDependencies 方法及其相关实现 - 简化了依赖排序流程,直接使用 sorter->sort() 进行排序 - 移除了相关的警告提示和调试信息输出逻辑 --- src/Php/Preprocessor.php | 68 +--------------------------------------- 1 file changed, 1 insertion(+), 67 deletions(-) diff --git a/src/Php/Preprocessor.php b/src/Php/Preprocessor.php index 0ed93328..f7ea9427 100644 --- a/src/Php/Preprocessor.php +++ b/src/Php/Preprocessor.php @@ -51,18 +51,7 @@ class Preprocessor extends CompilerBase $sorter->add($file, $deps); } - try { - // 尝试进行拓扑排序 - $sortedFiles = $sorter->sort(); - } catch (CircularDependencyException $e) { - // 检测到循环依赖,尝试打破循环 - $this->climate->yellow('Warning: Circular dependency detected, attempting to resolve...'); - $circularNodes = $e->getNodes(); - $this->climate->darkGray('Circular path: ' . implode(' -> ', $circularNodes)); - - // 使用打破循环后的依赖关系重新排序 - $sortedFiles = $this->resolveCircularDependencies($fileDeps, $circularNodes); - } + $sortedFiles = $sorter->sort(); // 添加未参与依赖管理的文件(非 stub 文件且不在已排序列表中) foreach ($list as $file) { @@ -162,61 +151,6 @@ class Preprocessor extends CompilerBase } } - /** - * 解决循环依赖问题 - * - * @param array $fileDeps 所有文件的依赖关系 - * @param array $circularNodes 循环依赖中的节点 - * @return array 排序后的文件列表 - * @throws ElementNotFoundException - */ - protected function resolveCircularDependencies(array $fileDeps, array $circularNodes): array - { - // 找出循环依赖中最少的边来打破循环 - // 策略:移除被依赖次数最少的文件的依赖关系 - $depCount = []; - foreach ($circularNodes as $node) { - $depCount[$node] = 0; - // 统计该节点在循环中被其他节点依赖的次数 - foreach ($circularNodes as $otherNode) { - if (isset($fileDeps[$otherNode]) && in_array($node, $fileDeps[$otherNode])) { - $depCount[$node]++; - } - } - } - - // 找到被依赖最少的节点,打破它的某个依赖 - asort($depCount); - $breakNode = key($depCount); - - $this->climate->darkGray("Breaking circular dependency at: {$breakNode}"); - - // 创建新的依赖关系,移除导致循环的依赖 - $resolvedDeps = $fileDeps; - if (isset($resolvedDeps[$breakNode])) { - // 移除该节点对循环中其他节点的依赖 - $resolvedDeps[$breakNode] = array_filter( - $resolvedDeps[$breakNode], - fn ($dep) => !in_array($dep, $circularNodes) || $dep === $breakNode - ); - } - - // 使用修正后的依赖关系重新排序 - $sorter = new StringSort(); - foreach ($resolvedDeps as $file => $deps) { - $sorter->add($file, $deps); - } - - try { - return $sorter->sort(); - } catch (CircularDependencyException $e) { - // 如果仍然存在循环,递归处理 - $remainingCircular = $e->getNodes(); - $this->climate->yellow('Still has circular dependency, continuing to resolve...'); - return $this->resolveCircularDependencies($resolvedDeps, $remainingCircular); - } - } - protected function findSymbolUsing(NodeAbstract $ast) { $nodeFinder = new NodeFinder();