定制 edmondscommerce/php-generic 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

edmondscommerce/php-generic

Composer 安装命令:

composer require edmondscommerce/php-generic

包简介

Generator for generic array/vector.

README 文档

README

Please see original: https://github.com/d0niek/php-generic

This is now becoming more of a pure wrapper for php-ds to allow generating of typed implementations of the php-ds data structures.

Currently there is only Vector, though more might be added as we need them

PHPStan

Currently seeing some issues with PHPStan, suggest the following ignore errors:

parameters:
    ignoreErrors:
        - '#unknown class.+?HumbugBox.+?Vector#'
        - '#Vector.+?offset.+?\(\) should be contravariant#'
        - '#Cannot .+? offset int .+? Ds\\Vector#'

Original README

Prepare for future with php-generic

According to this article which shows how to create strictly typed arrays and collections in Php7, php-generic generator was born.

There is some discusion about generic in Php but who knows when it comes to us.

It is not exacly what you know from Java or C++ where generic looks like Vector<int>(), Array<bool>() or Vector<\Namespace\Entity\User>().

Here generics looks like VectorInt, ArrayBool and VectorUser so I hope when they come to nativ Php all what you need to do will be:

  1. Replace all VectorType, ArrayType to Vector<Type>, array<Type>,
  2. Delete directory where you store all generated array/vector,
  3. Enjoy a nice day.

What generics are (not)

They are not collections like Doctrine or Laravel Collections. They are like normal php array which can store values one type. array<int> can store only numeric values which will converted to int so you can not push 'some string value' to it.

Install

$ composer require d0niek/php-generic

Generate generic array<Type>

There is a bin command that you should find in vendor/bin or somewhere else according to your composer.json settings.

To generate a generic array run:

$ bin/generic generate:array [-s|--save [SAVE]] [--] <type> <namespace>

where:

  • -s|--saveCollection - do you want to save generated array for future regenerate (default true),
  • type - is a type of generic array. It can be simple type (bool, int, float, string, array) or complex type (\YourApp\Module\Repository\User),
  • namespace - is a namespace where new generic array will be save. Remember that namespace's directory have to exists. To separate namespace parts use \\ or / to speed up typing if your namespace is 1:1 with your directory structure

For example you have project in /path/to/project and your composer.json contains this kind of entry:

"autoload": {
    "psr-4": {
        "VendorName\\AppName\\": "src/"
    }
}

Now, when you call command like this:

$ bin/generic generate:array int VendorName\\AppName\\Collections

new generic array ArrayInt will be save to /path/to/project/src/Collections/ directory. If this directory does not exists, exceptions will be throw.

Tip! Store all php-generics in one diretory and add it to .gitignore. When php will start support generics, replace ArrayInt to array<int> and remove php-generic directory.

Generate generic Vector<Type>

You can alse generate generic \Ds\Vector (it is new data structure since Php7, here you can and you should read about it!). To do this just run:

$ bin/generic generate:vector [-s|--save [SAVE]] [--] <type> <namespace>

parameters means exacly the same whats means when you run generate:array.

Regenerate

By defaule generated array/vector are save in generated-colletions.json file in your root app path. Keep this file in repository and ignore all generated php-generics. When you clone repository, after composer install run:

$ bin/generic collections:regenerate

and all your collections will be regenerate.

Select data from DB

Now you can create in easy way specific generic when you are selecting data from 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;
    }

    ...
}

Test

Before you run tests remember to regenerate collections. Run:

$ bin/generic collections:regenerate

and now you can run

$ phpunit

edmondscommerce/php-generic 适用场景与选型建议

edmondscommerce/php-generic 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 2.09k 次下载、GitHub Stars 达 0, 最近一次更新时间为 2019 年 03 月 15 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「generator」 「php」 「array」 「generic」 「vector」 「php71」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 edmondscommerce/php-generic 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 edmondscommerce/php-generic 我们能提供哪些服务?
定制开发 / 二次开发

基于 edmondscommerce/php-generic 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 2.09k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 17
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 1
  • Forks: 1
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2019-03-15