- 创建 class-method-override-order.php 测试文件,包含子类先于父类定义的场景 - 实现 ClassMethodOverrideTest 类,验证编译器对类方法重写的双向递归处理 - 添加 testChildBeforeParentOverride 方法,测试父子类方法重写关系的正确识别 - 验证父类方法被正确标记为被子类覆盖的状态 - 确保子类方法未被错误标记为已覆盖状态 - 通过反射访问编译器内部的 classMethodOverride 属性进行断言验证pull/1/head
parent
f803a0fd41
commit
207bc6b48b
2 changed files with 50 additions and 0 deletions
@ -0,0 +1,22 @@ |
||||
<?php |
||||
// 子类先于父类定义,测试 classMethodOverride 的双向递归是否正确 |
||||
class ChildOverride extends ParentBase { |
||||
public function bar(): void { |
||||
echo "Child\n"; |
||||
} |
||||
} |
||||
|
||||
class ParentBase { |
||||
public function run(): void { |
||||
$this->bar(); |
||||
} |
||||
|
||||
public function bar(): void { |
||||
echo "Parent\n"; |
||||
} |
||||
} |
||||
|
||||
function main(): void { |
||||
$o = new ChildOverride(); |
||||
$o->run(); |
||||
} |
||||
@ -0,0 +1,28 @@ |
||||
<?php |
||||
|
||||
use PhpAot\Php\CompilerTest; |
||||
|
||||
class ClassMethodOverrideTest extends \BaseTest |
||||
{ |
||||
public function testChildBeforeParentOverride(): void |
||||
{ |
||||
$compiler = CompilerTest::create(ROOT_PATH); |
||||
$testFile = __DIR__ . '/../code/class-method-override-order.php'; |
||||
$compiler->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'); |
||||
} |
||||
} |
||||
Loading…
Reference in new issue