andrew-gos/class-builder

用于从数组或其他类型构建对象的先进库

1.2.2 2024-09-26 12:11 UTC

This package is auto-updated.

Last update: 2024-09-26 12:12:00 UTC


README

版本 1.2.2

描述

此库提供了从数组或标量构建对象的功能。

该库允许构建接口、抽象类、对象数组。它还支持构建类型为数组的对象参数。还有可能从数组构建可变参数。此外,您还可以从标量值构建具有单个必需参数的类。还可以将类型为类型交集或并集的参数组装在一起。

该库从构造函数的参数收集关于对象参数的信息。

联系方式

如果您遇到错误或有一个想法,请发送电子邮件至 Gostev71@outlook.com 并在邮件主题中输入 Telegram Library BugTelegram Library Idea

安装

要安装库,请使用Composer

composer require andrew-gos/class-builder

简单示例

要构建一个对象,请编写

<?php

use AndrewGos\ClassBuilder\ClassBuilder;

class A
{
    public function __construct(
        private int $a,
    ) {
    }
}

$classBuilder = new ClassBuilder();
$a = $classBuilder->build(A::class, ['a' => 1]);

构建抽象类和接口

要构建接口或抽象类,请使用AvailableInheritors属性指定可用的继承者。
将返回第一个成功构建的对象。
此属性可以接受继承者的数组。

请注意,如果您将类参数类型指定为类型的交集,则此库将构建包含在类型中每个接口或类中的继承者。

<?php

use AndrewGos\ClassBuilder\Attribute\AvailableInheritors;

#[AvailableInheritors([B::class, C::class])]
interface A {}

class B implements A {}

class C implements A {}

构建的数据检查器

要控制接口或抽象类的构建,您可以使用继承类的BuildIf属性。
此属性指示构建器在构建前检查数据。如果检查失败,构建器将不会构建对象。
BuildIf属性可以接受CheckerInterface属性的对象。

<?php

use AndrewGos\ClassBuilder\Attribute\AvailableInheritors;
use AndrewGos\ClassBuilder\Attribute\BuildIf;
use AndrewGos\ClassBuilder\Checker\FieldIsChecker;

#[AvailableInheritors([B::class, C::class])]
interface A {}

#[BuildIf(new FieldIsChecker('type', 'b'))]
class B implements A {}

#[BuildIf(new FieldIsChecker('type', 'a'))]
class C implements A {}

在此示例中,只有当数据包含字段type等于b时,才会构建类B的对象。

构建类型数组

要构建类型数组,请使用ArrayType属性。该属性可以接受一个类型、类型的数组或ArrayType对象作为参数。

<?php

use AndrewGos\ClassBuilder\Attribute\ArrayType;

class A
{
    public function __construct(
        #[ArrayType('int')] private array $a,
    ) {
    }
}

从标量值构建对象

如果一个对象只有一个必需的参数,该库允许从标量值构建这样的对象。使用CanBeBuiltFromScalar属性。

<?php

use AndrewGos\ClassBuilder\Attribute\CanBeBuiltFromScalar;
use AndrewGos\ClassBuilder\ClassBuilder;

#[CanBeBuiltFromScalar]
class A
{
    public function __construct(
        private int $a,
    ) {
    }
}

$classBuilder = new ClassBuilder();
$a = $classBuilder->build(A::class, 1);

从具有自定义名称的字段获取值

如果您想,您可以重新定义从其中获取对象属性组装值的字段。
要这样做,请使用Field属性。

<?php

use AndrewGos\ClassBuilder\ClassBuilder;
use AndrewGos\ClassBuilder\Attribute\Field;

class A
{
    public function __construct(
        #[Field('b')] private int $a,
    ) {
    }
}

$classBuilder = new ClassBuilder();
$a = $classBuilder->build(A::class, ['b' => 1]);