fix(traits): 解决trait中方法参数类型解析问题

- 添加trait注入class时使用完整类名的处理逻辑
- 重构参数类型解析逻辑,统一使用parseTypeDecl方法
- 修复void/never类型作为参数类型的错误检查
- 简化类型判断和类名获取流程
- 添加测试用例验证trait方法冲突处理
pull/1/head v0.1.0
韩天峰 4 months ago
parent 799aa629c0
commit ffdf4c6653
  1. 26
      src/Php/CompilerBase.php
  2. 39
      tests/aot/trait/009.phpt

@ -801,6 +801,10 @@ class CompilerBase extends \PhpAot\Core\Translator
} else {
$class = $this->getNamespacedClassName($typeName);
}
// Trait 在注入 class 需要使用完整类名
if ($class and $this->classDef and $this->classDef->trait) {
$type->name = $class;
}
return self::TYPE_OBJECT;
}
}
@ -1976,23 +1980,13 @@ class CompilerBase extends \PhpAot\Core\Translator
if ($param->byRef) {
return self::TYPE_REF;
}
if ($param->type === null or $param->type instanceof NullableType or $param->type instanceof UnionType) {
return self::TYPE_VAR;
}
$type = $param->type;
$typeName = $type->name;
if ($typeName === 'void' or $typeName === 'never') {
$this->fatalError($param, 'Cannot use `void`/`never` as a parameter type.');
} elseif ($typeName === 'self') {
$class = $this->classDef->getNamespacedName(false);
} elseif (isset($this->zendTypeMap[$typeName])) {
return $this->getTypeFromZendType($typeName);
} else {
$class = $this->getNamespacedClassName($typeName);
$class = '';
$type = $this->parseTypeDecl($param->type, self::DECL_TYPE_OF_PARAM, $class);
if ($class) {
$this->addObject($var, $class);
$argInfo->class = $class;
}
$this->addObject($var, $class);
$argInfo->class = $class;
return self::TYPE_OBJECT;
return $type;
}
protected function parseIncludes(): string

@ -0,0 +1,39 @@
--TEST--
Method conflict in traits
--FILE--
<?php
namespace App1 {
class Foo1 {
public string $prop = 'Hello 1';
}
}
namespace App2 {
use App1\Foo1;
trait THello1
{
public function hello(Foo1 $foo1)
{
var_dump($foo1);
}
}
}
namespace App3 {
use App2\THello1;
class TraitsTest
{
use THello1;
}
}
namespace {
function main()
{
$foo1 = new App1\Foo1;
$o = new App3\TraitsTest;
$o->hello($foo1);
}
}
?>
--EXPECT--
Loading…
Cancel
Save