adp/php-dto

PHP 数据传输对象

v1.0.0 2021-10-07 09:31 UTC

This package is auto-updated.

Last update: 2024-09-07 16:08:50 UTC


README

简单的数据传输对象。

安装

安装此扩展的首选方式是通过 composer

运行以下命令之一:

php composer.phar require --prefer-dist adp/php-dto "*"

或将以下内容添加到您的 composer.json 文件的 "require" 部分:

"adp/php-dto": "*"

其他包

spatie/data-transfer-object

该包使用 doc-block 验证,这既不方便又不明显。

从 PHP8 开始,这个库可以被认为,因为自库的 3.x 版本以来,就没有提供通过 phpdoc 进行验证的功能。

差异

  • 没有 toJson () 函数

jenssegers/model

这是一个类似于 Laravel 的 Eloquent 的模型包,但也可以用作 DTO。

差异

  • 不使用反射。
  • toArray () 函数不将内部模型转换为数组,而是将其作为对象留下。

cast/model

Jessenger 模型的轻量级版本。

差异

  • 不使用反射。
  • toArray () 函数不将内部模型转换为数组,而是将其作为对象留下。

PHP 数据结构

对于某些类型的任务,你可以使用实现 PHP 基本数据结构的扩展。

与替代包的基准测试

环境

  • Mac OS
  • PHP 7.3.24
+-----------------------------------+-------------------+-----+------+-----+------------+---------+---------+---------+---------+---------+--------+--------+
| benchmark                         | subject           | set | revs | its | mem_peak   | best    | mean    | mode    | worst   | stdev   | rstdev | diff   |
+-----------------------------------+-------------------+-----+------+-----+------------+---------+---------+---------+---------+---------+--------+--------+
| CompositeDtoCreateFromStaticBench | benchPushworldDto | 0   | 1000 | 5   | 1,738,088b | 3.800μs | 3.820μs | 3.812μs | 3.849μs | 0.018μs | 0.46%  | 17.87x |
| CompositeDtoCreateFromStaticBench | benchSpatieDto    | 0   | 1000 | 5   | 1,740,000b | 7.808μs | 7.890μs | 7.849μs | 8.046μs | 0.086μs | 1.09%  | 36.90x |
| CompositeDtoCreateFromStaticBench | benchJessengerDto | 0   | 1000 | 5   | 1,935,392b | 9.045μs | 9.405μs | 9.329μs | 9.873μs | 0.273μs | 2.90%  | 43.99x |
| CompositeDtoCreateFromStaticBench | benchCastDto      | 0   | 1000 | 5   | 1,738,072b | 4.894μs | 4.920μs | 4.932μs | 4.944μs | 0.020μs | 0.41%  | 23.01x |

| CompositeDtoToArrayBench          | benchPushworldDto | 0   | 1000 | 5   | 2,031,872b | 1.231μs | 1.240μs | 1.235μs | 1.252μs | 0.008μs | 0.68%  | 5.80x  |
| CompositeDtoToArrayBench          | benchSpatieDto    | 0   | 1000 | 5   | 2,039,960b | 4.682μs | 4.799μs | 4.759μs | 4.990μs | 0.102μs | 2.12%  | 22.45x |
| CompositeDtoToArrayBench          | benchJessengerDto | 0   | 1000 | 5   | 2,031,872b | 1.776μs | 1.794μs | 1.790μs | 1.820μs | 0.016μs | 0.87%  | 8.39x  |
| CompositeDtoToArrayBench          | benchCastDto      | 0   | 1000 | 5   | 2,031,864b | 0.217μs | 0.219μs | 0.219μs | 0.222μs | 0.002μs | 0.78%  | 1.03x  |

| DtoCreateBench                    | benchPushworldDto | 0   | 1000 | 5   | 1,738,024b | 1.763μs | 1.767μs | 1.767μs | 1.771μs | 0.003μs | 0.17%  | 8.27x  |
| DtoCreateBench                    | benchSpatieDto    | 0   | 1000 | 5   | 1,738,008b | 3.727μs | 3.787μs | 3.742μs | 3.884μs | 0.065μs | 1.71%  | 17.71x |
| DtoCreateBench                    | benchJessengerDto | 0   | 1000 | 5   | 1,927,208b | 4.400μs | 4.449μs | 4.464μs | 4.477μs | 0.029μs | 0.65%  | 20.81x |
| DtoCreateBench                    | benchCastDto      | 0   | 1000 | 5   | 1,738,008b | 2.163μs | 2.205μs | 2.192μs | 2.266μs | 0.035μs | 1.58%  | 10.31x |

| DtoCreateFromStaticBench          | benchPushworldDto | 0   | 1000 | 5   | 1,738,040b | 1.926μs | 1.949μs | 1.932μs | 1.988μs | 0.025μs | 1.30%  | 9.12x  |
| DtoCreateFromStaticBench          | benchSpatieDto    | 0   | 1000 | 5   | 1,738,024b | 3.900μs | 4.047μs | 4.016μs | 4.225μs | 0.111μs | 2.75%  | 18.93x |
| DtoCreateFromStaticBench          | benchJessengerDto | 0   | 1000 | 5   | 1,927,800b | 4.670μs | 4.731μs | 4.702μs | 4.789μs | 0.049μs | 1.03%  | 22.13x |
| DtoCreateFromStaticBench          | benchCastDto      | 0   | 1000 | 5   | 1,738,024b | 2.350μs | 2.371μs | 2.359μs | 2.407μs | 0.022μs | 0.93%  | 11.09x |

| DtoToArrayBench                   | benchPushworldDto | 0   | 1000 | 5   | 2,006,968b | 0.535μs | 0.537μs | 0.536μs | 0.540μs | 0.002μs | 0.32%  | 2.51x  |
| DtoToArrayBench                   | benchSpatieDto    | 0   | 1000 | 5   | 2,014,216b | 2.310μs | 2.348μs | 2.343μs | 2.398μs | 0.032μs | 1.37%  | 10.98x |
| DtoToArrayBench                   | benchJessengerDto | 0   | 1000 | 5   | 2,006,968b | 1.713μs | 1.747μs | 1.755μs | 1.767μs | 0.020μs | 1.13%  | 8.17x  |
| DtoToArrayBench                   | benchCastDto      | 0   | 1000 | 5   | 2,006,960b | 0.208μs | 0.214μs | 0.214μs | 0.219μs | 0.004μs | 1.71%  | 1.00x  |
+-----------------------------------+-------------------+-----+------+-----+------------+---------+---------+---------+---------+---------+--------+--------+

环境

  • Docker 中的 Linux
  • PHP 7.3.27 与 Xdebug 3.0.4
+-----------------------------------+-------------------+-----+------+-----+------------+-------------+-------------+-------------+-------------+----------+--------+--------+
| benchmark                         | subject           | set | revs | its | mem_peak   | best        | mean        | mode        | worst       | stdev    | rstdev | diff   |
+-----------------------------------+-------------------+-----+------+-----+------------+-------------+-------------+-------------+-------------+----------+--------+--------+
| CompositeDtoCreateFromStaticBench | benchPushworldDto | 0   | 1000 | 5   | 1,817,624b | 235.848μs   | 241.131μs   | 239.282μs   | 249.452μs   | 4.878μs  | 2.02%  | 5.10x  |
| CompositeDtoCreateFromStaticBench | benchSpatieDto    | 0   | 1000 | 5   | 1,819,392b | 770.998μs   | 791.278μs   | 781.846μs   | 825.881μs   | 19.408μs | 2.45%  | 16.73x |
| CompositeDtoCreateFromStaticBench | benchJessengerDto | 0   | 1000 | 5   | 2,038,472b | 1,271.636μs | 1,297.250μs | 1,297.815μs | 1,324.512μs | 17.943μs | 1.38%  | 27.43x |
| CompositeDtoCreateFromStaticBench | benchCastDto      | 0   | 1000 | 5   | 1,817,608b | 582.042μs   | 588.277μs   | 585.578μs   | 597.356μs   | 5.640μs  | 0.96%  | 12.44x |

| CompositeDtoToArrayBench          | benchPushworldDto | 0   | 1000 | 5   | 2,159,176b | 77.260μs    | 80.439μs    | 81.864μs    | 82.848μs    | 2.155μs  | 2.68%  | 1.70x  |
| CompositeDtoToArrayBench          | benchSpatieDto    | 0   | 1000 | 5   | 2,170,784b | 499.391μs   | 514.750μs   | 517.551μs   | 530.119μs   | 10.906μs | 2.12%  | 10.89x |
| CompositeDtoToArrayBench          | benchJessengerDto | 0   | 1000 | 5   | 2,159,176b | 355.934μs   | 361.488μs   | 362.264μs   | 366.042μs   | 3.297μs  | 0.91%  | 7.64x  |
| CompositeDtoToArrayBench          | benchCastDto      | 0   | 1000 | 5   | 2,159,168b | 47.719μs    | 49.327μs    | 49.765μs    | 50.282μs    | 0.915μs  | 1.85%  | 1.04x  |

| DtoCreateBench                    | benchPushworldDto | 0   | 1000 | 5   | 1,817,592b | 113.811μs   | 115.436μs   | 114.786μs   | 118.301μs   | 1.533μs  | 1.33%  | 2.44x  |
| DtoCreateBench                    | benchSpatieDto    | 0   | 1000 | 5   | 1,817,576b | 352.823μs   | 363.898μs   | 366.375μs   | 370.764μs   | 6.325μs  | 1.74%  | 7.70x  |
| DtoCreateBench                    | benchJessengerDto | 0   | 1000 | 5   | 2,030,088b | 579.995μs   | 596.356μs   | 605.225μs   | 612.968μs   | 13.574μs | 2.28%  | 12.61x |
| DtoCreateBench                    | benchCastDto      | 0   | 1000 | 5   | 1,817,576b | 258.759μs   | 263.110μs   | 260.695μs   | 272.890μs   | 5.090μs  | 1.93%  | 5.56x  |

| DtoCreateFromStaticBench          | benchPushworldDto | 0   | 1000 | 5   | 1,817,608b | 128.617μs   | 130.258μs   | 129.600μs   | 132.178μs   | 1.314μs  | 1.01%  | 2.75x  |
| DtoCreateFromStaticBench          | benchSpatieDto    | 0   | 1000 | 5   | 1,817,592b | 369.513μs   | 379.794μs   | 376.796μs   | 395.002μs   | 8.385μs  | 2.21%  | 8.03x  |
| DtoCreateFromStaticBench          | benchJessengerDto | 0   | 1000 | 5   | 2,030,744b | 589.843μs   | 602.395μs   | 605.413μs   | 612.838μs   | 7.964μs  | 1.32%  | 12.74x |
| DtoCreateFromStaticBench          | benchCastDto      | 0   | 1000 | 5   | 1,817,592b | 266.649μs   | 274.010μs   | 272.662μs   | 283.349μs   | 5.762μs  | 2.10%  | 5.79x  |

| DtoToArrayBench                   | benchPushworldDto | 0   | 1000 | 5   | 2,133,936b | 45.658μs    | 47.285μs    | 46.862μs    | 49.602μs    | 1.492μs  | 3.16%  | 1.00x  |
| DtoToArrayBench                   | benchSpatieDto    | 0   | 1000 | 5   | 2,144,672b | 240.133μs   | 246.860μs   | 244.286μs   | 256.458μs   | 5.898μs  | 2.39%  | 5.22x  |
| DtoToArrayBench                   | benchJessengerDto | 0   | 1000 | 5   | 2,133,936b | 364.639μs   | 369.880μs   | 366.924μs   | 382.063μs   | 6.217μs  | 1.68%  | 7.82x  |
| DtoToArrayBench                   | benchCastDto      | 0   | 1000 | 5   | 2,133,928b | 49.134μs    | 50.241μs    | 50.670μs    | 51.512μs    | 0.930μs  | 1.85%  | 1.06x  |
+-----------------------------------+-------------------+-----+------+-----+------------+-------------+-------------+-------------+-------------+----------+--------+--------+

替代方法的实现

获取所有属性和值作为数组的函数

$class = new ReflectionClass(static::class);

$properties = $class->getProperties(ReflectionProperty::IS_PUBLIC);

foreach ($properties as $property) {
    if ($property->isStatic()) {
        continue;
    }

    $data[$property->getName()] = $property->getValue($this);
}        

Spatie 包使用此函数,但速度较慢。