andrew-gos/ class-builder
用于从数组或其他类型构建对象的先进库
1.2.2
2024-09-26 12:11 UTC
Requires
- php: >=8.2
- ext-ctype: *
Requires (Dev)
- phpunit/phpunit: >=11.2
README
版本 1.2.2
描述
此库提供了从数组或标量构建对象的功能。
该库允许构建接口、抽象类、对象数组。它还支持构建类型为数组的对象参数。还有可能从数组构建可变参数。此外,您还可以从标量值构建具有单个必需参数的类。还可以将类型为类型交集或并集的参数组装在一起。
该库从构造函数的参数收集关于对象参数的信息。
联系方式
如果您遇到错误或有一个想法,请发送电子邮件至 Gostev71@outlook.com 并在邮件主题中输入 Telegram Library Bug
或 Telegram 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]);