adp / php-dto
PHP 数据传输对象
v1.0.0
2021-10-07 09:31 UTC
Requires
- php: >=7.3
- ext-json: *
Requires (Dev)
- cast/model: ^1.0
- jenssegers/model: ^1.4
- phpbench/phpbench: 0.17.1
- phpmd/phpmd: ^2.9
- phpunit/phpunit: ^9.5
- slevomat/coding-standard: ^7.0
- spatie/data-transfer-object: ^1.13
- squizlabs/php_codesniffer: ^3.6
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 包使用此函数,但速度较慢。