跳至正文

更新日志 1.1.0 — 2022 年 12 月 20 日

重要变更

处理类泛型类型继承

现在可以使用@extends标签(已由 PHPStan 和 Psalm 处理)来声明父类泛型的类型。这个逻辑递归地应用于所有父母。

/**
 * @template FirstTemplate
 * @template SecondTemplate
 */
abstract class FirstClassWithGenerics
{
    /** @var FirstTemplate */
    public $valueA;

    /** @var SecondTemplate */
    public $valueB;
}

/**
 * @template FirstTemplate
 * @extends FirstClassWithGenerics<FirstTemplate, int>
 */
abstract class SecondClassWithGenerics extends FirstClassWithGenerics
{
    /** @var FirstTemplate */
    public $valueC;
}

/**
 * @extends SecondClassWithGenerics<string>
 */
final class ChildClass extends SecondClassWithGenerics
{
}

$object = (new \CuyZ\Valinor\MapperBuilder())
    ->mapper()
    ->map(ChildClass::class, [
        'valueA' => 'foo',
        'valueB' => 1337,
        'valueC' => 'bar',
    ]);

echo $object->valueA; // 'foo'
echo $object->valueB; // 1337
echo $object->valueC; // 'bar'

添加了对类推断的支持

现在可以像推断接口一样推断抽象类或父类。

抽象类的示例:

abstract class SomeAbstractClass
{
    public string $foo;

    public string $bar;
}

final class SomeChildClass extends SomeAbstractClass
{
    public string $baz;
}

$result = (new \CuyZ\Valinor\MapperBuilder())
    ->infer(
        SomeAbstractClass::class,
        fn () => SomeChildClass::class
    )
    ->mapper()
    ->map(SomeAbstractClass::class, [
        'foo' => 'foo',
        'bar' => 'bar',
        'baz' => 'baz',
    ]);

assert($result instanceof SomeChildClass);
assert($result->foo === 'foo');
assert($result->bar === 'bar');
assert($result->baz === 'baz');

新功能

  • 添加对类推断的支持 ( 5a90ad )
  • 处理类泛型类型继承( 6506b7 )

错误修复

  • 处理 PHPStan 扩展中的object返回类型 ( 201728 )
  • 在 PHPStan 配置中导入插件类文件 ( 58d540 )
  • 当检测到多余的键时保留嵌套错误( 813b3b )

其他

  • 使用 PHP 8.0 语法调整代码 ( 3fac3e )
  • 在类定义中添加isAbstract标志 ( ad0c06 )
  • 在类定义中添加isFinal标志 ( 25da31 )
  • 增强TreeMapper::map()返回类型签名 ( dc32d3 )
  • 改进TreeMapper的返回类型签名 ( c8f362 )
  • 防止多次缓存往返 ( 13b620 )