d0niek / php-generic
泛型数组/向量的生成器
Requires
- php: ^7.1
- symfony/console: ^3.2
Requires (Dev)
- phpmd/phpmd: ^2.6
- phpunit/phpunit: ^6.1
- squizlabs/php_codesniffer: ^2.8
Suggests
- php-ds/php-ds: ^1.1
README
根据这篇文章,展示了如何在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-colletions.json 文件中。请将此文件保存在存储库中,并忽略所有生成的php-generics。当您克隆存储库时,在 composer install 之后运行
$ bin/generic collections:regenerate
然后您的所有集合都将重新生成。
从DB中选择数据
现在您可以在从DB中选择数据时轻松创建特定的泛型。
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