edmondscommerce / php-generic
通用数组/向量生成器。
Requires
- php: ^7.2
- ext-ds: *
- ext-json: *
- edmondscommerce/typesafe-functions: ^0.2
- php-ds/php-ds: ^1.2
- symfony/console: ^3.2|^4.2
Requires (Dev)
- edmondscommerce/phpqa: ~2.0.11
- phpstan/phpstan-phpunit: ^0.11.0
README
请参阅原始版本: https://github.com/d0niek/php-generic
现在,这个项目正逐渐成为一个为 php-ds 生成类型化实现的纯包装器。
目前只有 Vector,但随着我们的需求可能会添加更多。
PHPStan
目前遇到一些与 PHPStan 的问题,建议忽略以下错误
parameters:
ignoreErrors:
- '#unknown class.+?HumbugBox.+?Vector#'
- '#Vector.+?offset.+?\(\) should be contravariant#'
- '#Cannot .+? offset int .+? Ds\\Vector#'
原始 README
用 php-generic 准备未来
根据这篇文章 创建 Php7 中的严格类型数组和方法,php-generic 生成器应运而生。
关于 Php 中的泛型有一些 讨论,但谁知道它何时会到来。
它并不完全像 Java 或 C++ 中的泛型,比如 Vector<int>()
、Array<bool>()
或 Vector<\Namespace\Entity\User>()
。
在这里泛型看起来像是 VectorInt
、ArrayBool
和 VectorUser
,所以希望当它们到达原生 Php 时,你所需做的只是
- 将所有的
VectorType
、ArrayType
替换为Vector<Type>
、array<Type>
, - 删除存储所有生成数组/向量的目录,
- 享受美好的一天。
泛型是什么(不是)
它们不是像 Doctrine 或 Laravel Collections 这样的集合。它们类似于普通的 Php 数组,可以存储同一类型的值。例如,array<int>
只能存储数值,并将其转换为 int
,因此你无法向其中推送 'some string value'
。
安装
$ composer require d0niek/php-generic
生成通用 array<Type>
你可以在 vendor/bin 或根据你的 composer.json 设置的其他位置找到一个 bin 命令。
要生成一个通用数组,请运行
$ bin/generic generate:array [-s|--save [SAVE]] [--] <type> <namespace>
其中
- -s|--saveCollection - 是否要保存生成的数组以供将来重新生成(默认 true),
- type - 通用数组的数据类型。它可以是简单类型(bool、int、float、string、array)或复杂类型(\YourApp\Module\Repository\User),
- namespace - 新通用数组将保存的命名空间。请记住,命名空间的目录必须存在。为了分隔命名空间部分,请使用 \\ 或 / 以加快输入,如果你的命名空间与目录结构一一对应
例如,你有一个位于 /path/to/project 的项目,并且你的 composer.json 包含以下条目
"autoload": { "psr-4": { "VendorName\\AppName\\": "src/" } }
现在,当你调用此命令时
$ bin/generic generate:array int VendorName\\AppName\\Collections
新的通用数组 ArrayInt
将保存到 /path/to/project/src/Collections/ 目录。如果此目录不存在,将会抛出异常。
提示!将所有 php-generics 存储在一个目录中,并将其添加到 .gitignore。当 Php 开始支持泛型时,将
ArrayInt
替换为array<int>
并删除 php-generic 目录。
生成通用 Vector<Type>
你还可以生成通用 \Ds\Vector(这是自 Php7 以来出现的新数据结构,在这里你可以也应该阅读有关它的内容!)。为此,只需运行
$ bin/generic generate:vector [-s|--save [SAVE]] [--] <type> <namespace>
参数的含义与运行 generate:array
时相同。
重新生成
默认情况下生成的数组/向量被保存在您的根应用路径下的 generated-collections.json 文件中。请将此文件保留在仓库中,并忽略所有生成的 php-generics。当您克隆仓库后,在运行 composer install
命令之后
$ bin/generic collections:regenerate
您的所有集合将被重新生成。
从数据库中选择数据
现在,当您从数据库中选择数据时,可以轻松创建特定的泛型。
class UserRepository implements UserRepositoryInterface { ... /** * @inheritDoc */ public function findAll(): VectorUser { $users = new VectorUser(); $mysqli = new \mysqli('localhost:3306', 'user', 'password', 'db'); $mysqliResult = $mysqli->query('SELECT id, name FROM users LIMIT 10'); if ($mysqliResult !== false) { while (($user = $mysqliResult->fetch_object(User::class)) !== null) { $users->push($user); } } $mysqli->close(); return $users; } ... }
测试
在运行测试之前,请记住重新生成集合。运行
$ bin/generic collections:regenerate
现在您就可以运行测试了。
$ phpunit