d0niek / php-generic

泛型数组/向量的生成器

1.0.2 2017-04-12 16:02 UTC

This package is auto-updated.

Last update: 2024-09-07 07:37:24 UTC


README

根据这篇文章,展示了如何在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-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