neovg/php-struct

一个类似于"C struct"的类,具有类型安全的属性和流畅的设置器接口。

1.4.14 2021-11-12 19:15 UTC

This package is auto-updated.

Last update: 2024-09-13 00:53:45 UTC


README

一个类似于"C struct"的类,具有类型安全的属性和流畅的设置器接口。

概要

/**
 * @property int    $foo
 * @property string $bar
 *
 * @method $this withFoo(int $value)
 * @method $this withBar(string $value)
 */
class DataStruct extends StructAbstract
{
}

$data = DataStruct::createFromJson(
    '{"foo":1,"bar":"something"}'
);

$data = DataStruct::createFromArray([
    'foo' => 1,
    'bar' => 'something',
]);

$data = (new DataStruct())
    ->withFoo(1)
    ->withBar('something');

$data = new DataStruct();
$data->foo = 1;
$data->bar = 'something';

echo $data->foo; // '1'
echo $data->bar; // 'something'
echo (string)$data; // '{"foo":1,"bar":"something"}'

描述

一种方便创建严格类型类的方法,用于任意数据结构,无需编写大量的getter和setter。为了更大的方便,设置器可以链式使用。

此外,实例化对象转换为字符串将返回JSON!

工作原理

StructAbstract读取@property-read注解,并创建它们的内部表示,然后由魔法方法call()和get()使用,以模拟严格类型的设置器和可读属性。

属性可用的数据类型

  • bool
  • int
  • double
  • string
  • array
  • object
  • callable

存储对象

在Structs中存储对象时,注解中的类型必须是实际的类(或其某些超类),因为传递给设置器的参数将通过instanceof进行验证。

默认值

每个属性的默认值是null。您可以通过添加具有默认值的同名字段(私有或受保护)来覆盖此值。

/**
 * @method WithDefaultStruct someproperty(int $value)
 *
 * @property-read string $someproperty
 */
class WithDefaultStruct extends StructAbstract
{
    protected $someproperty = 'default value';
}

$data = new WithDefaultStruct();

echo $data->someproperty; // 'default value'

数组属性

/**
 * @property string[] $strings
 * @property ChildStruct[] $childs
 */
class ArrayStruct extends StructAbstract
{
}

$array = ArrayStruct::createFromArray([
    'strings' => ['foo', 'bar'],
    'childs' => [
        ['property' => 'value1'],
        ['property' => 'value2'],
    ],
]);

echo $array->strings[0]; // 'foo'
echo $array->childs[0]->property; // 'value1'