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'); + } +}