edmondscommerce/php-generic

通用数组/向量生成器。

3.0.0 2019-06-14 13:05 UTC

This package is auto-updated.

Last update: 2024-09-15 01:35:29 UTC


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>()

在这里泛型看起来像是 VectorIntArrayBoolVectorUser,所以希望当它们到达原生 Php 时,你所需做的只是

  1. 将所有的 VectorTypeArrayType 替换为 Vector<Type>array<Type>
  2. 删除存储所有生成数组/向量的目录,
  3. 享受美好的一天。

泛型是什么(不是)

它们不是像 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