fix(php): 解决匿名类继承父类名称解析问题

- 在编译器中为匿名类继承的父类添加全限定名称转换
- 修复了当匿名类继承使用use导入的类时的名称解析错误
- 添加了对继承类名的命名空间处理逻辑
- 确保匿名类能够正确继承并访问父类方法
pull/1/head
韩天峰 4 months ago
parent 9d9556929f
commit 1567ad2f88
  1. 5
      src/Php/CompilerBase.php
  2. 0
      tests/aot/anon_class/001.phpt
  3. 35
      tests/aot/anon_class/002.phpt

@ -3071,6 +3071,11 @@ class CompilerBase extends \PhpAot\Core\Translator
$classDef = $expr->class;
$className = $this->genAnonClassName();
$classDef->name = new Node\Identifier($className);
// 继承父类可能是 use 的名称,需要转换成全限定名称
if ($classDef->extends !== null) {
$parentClass = $this->getNamespacedClassName($classDef->extends->toString());
$classDef->extends = new Node\Name\FullyQualified($parentClass);
}
$this->context->beforeStmtLines[] = 'static THREAD_LOCAL bool ' . $className . '_defined = false;';
$classCode = $this->genEmbeddedCode($classDef);
$this->addConstData($className . '_code', $classCode);

@ -0,0 +1,35 @@
--TEST--
Anonymous Classes - Runtime class definition
--FILE--
<?php
namespace TestApp {
class Greeter {
protected string $greeting;
public function __construct(string $greeting) {
$this->greeting = $greeting;
}
public function greet() {
return $this->greeting;
}
}
}
namespace {
use TestApp\Greeter;
function main() {
$class = new class("Hello") extends Greeter {
public function greet() {
return "{$this->greeting} from anonymous class";
}
};
echo $class->greet(), "\n";
}
}
?>
--EXPECT--
Hello from anonymous class
Loading…
Cancel
Save