From 207bc6b48b562b1af89bc991556a2bdc8aa7cb69 Mon Sep 17 00:00:00 2001 From: tianfenghan Date: Tue, 9 Jun 2026 13:05:37 +0800 Subject: [PATCH] =?UTF-8?q?test(compiler):=20=E6=B7=BB=E5=8A=A0=E7=B1=BB?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E9=87=8D=E5=86=99=E9=A1=BA=E5=BA=8F=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建 class-method-override-order.php 测试文件,包含子类先于父类定义的场景 - 实现 ClassMethodOverrideTest 类,验证编译器对类方法重写的双向递归处理 - 添加 testChildBeforeParentOverride 方法,测试父子类方法重写关系的正确识别 - 验证父类方法被正确标记为被子类覆盖的状态 - 确保子类方法未被错误标记为已覆盖状态 - 通过反射访问编译器内部的 classMethodOverride 属性进行断言验证 --- phpunit/code/class-method-override-order.php | 22 +++++++++++++++ phpunit/src/ClassMethodOverrideTest.php | 28 ++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 phpunit/code/class-method-override-order.php create mode 100644 phpunit/src/ClassMethodOverrideTest.php diff --git a/phpunit/code/class-method-override-order.php b/phpunit/code/class-method-override-order.php new file mode 100644 index 00000000..b1468ad5 --- /dev/null +++ b/phpunit/code/class-method-override-order.php @@ -0,0 +1,22 @@ +bar(); + } + + public function bar(): void { + echo "Parent\n"; + } +} + +function main(): void { + $o = new ChildOverride(); + $o->run(); +} diff --git a/phpunit/src/ClassMethodOverrideTest.php b/phpunit/src/ClassMethodOverrideTest.php new file mode 100644 index 00000000..f7f4e773 --- /dev/null +++ b/phpunit/src/ClassMethodOverrideTest.php @@ -0,0 +1,28 @@ +addFiles([$testFile]); + $compiler->prepareFile($testFile); + + $ref = new ReflectionClass($compiler); + $prop = $ref->getProperty('classMethodOverride'); + $classMethodOverride = $prop->getValue($compiler); + + $parentMethodLower = strtolower('ParentBase::bar'); + $childMethodLower = strtolower('ChildOverride::bar'); + + $this->assertArrayHasKey($parentMethodLower, $classMethodOverride, 'ParentBase::bar should be registered'); + $this->assertArrayHasKey($childMethodLower, $classMethodOverride, 'ChildOverride::bar should be registered'); + // 父类方法应被标记为已被子类覆盖 + $this->assertTrue($classMethodOverride[$parentMethodLower], 'ParentBase::bar should be marked as overridden by child'); + // 子类方法未被覆盖 + $this->assertFalse($classMethodOverride[$childMethodLower], 'ChildOverride::bar should not be marked as overridden'); + } +}