tcds-io/php-better-generics
Composer 安装命令:
composer require tcds-io/php-better-generics
包简介
PHP library to better work with generics
README 文档
README
PHP 8.4+ library for working with generics at runtime: typed collections, lazy object proxies, and a reflection layer that understands @template, @extends, @implements, generic types, and array shapes from PHPDoc.
Why
PHP doesn't have native generics — only static analyzers (PHPStan, Psalm) do. This library bridges that gap at runtime by:
- Reading the PHPDoc you already write for static analysis (
@template T,@param list<Foo> $items,@extends Collection<User>) and exposing it through aReflectionClassAPI that resolves real FQNs. - Providing thin, well-typed
ArrayList<T>/Map<K, V>collections so@template-style code is also nice to write. - Offering
lazyOf()proxies on top of PHP 8.4's native lazy objects.
Install
composer require tcds-io/php-better-generics
Single runtime dependency: phpstan/phpdoc-parser (zero deps of its own).
Typed collections
use function Tcds\Io\Generic\listOf; use function Tcds\Io\Generic\mapOf; $users = listOf($alice, $bob, $carol); $names = $users ->filter(fn (User $u) => $u->isActive()) ->map(fn (User $u) => $u->name); $byEmail = $users->indexedBy(fn (User $u) => $u->email); // Map<string, User> $first = $users->first(fn (User $u) => $u->isAdmin()); $count = $users->count(fn (User $u) => $u->isActive());
MutableArrayList adds push, pop, set, removeAt, clear. Map implements ArrayAccess and Countable; MutableMap adds put, putAll, remove, clear.
Lazy proxies
use function lazyOf; use function lazyBufferOf; // Single proxy: $user is fully typed as User; constructor only runs on first access. $user = lazyOf(User::class, fn () => $userRepository->find($id)); // Buffered loader: collects keys, then loads in one batch when the buffer fills. $loader = lazyBufferOf( User::class, fn (array $ids) => $userRepository->findMany($ids), maxBufferSize: 50, ); $users = $orderIds->map(fn (string $orderId) => $loader->lazyOf($orderId)); // Each access fetches up to 50 users at once instead of N+1.
Generic-aware reflection
Read the PHPDoc, get back resolved types.
use Tcds\Io\Generic\Reflection\ReflectionClass; /** @template T */ class Collection { /** @return list<T> */ public function items(): array { /* ... */ } } /** @extends Collection<User> */ class UserCollection extends Collection {} $reflection = new ReflectionClass(UserCollection::class); $type = $reflection->getMethod('items')->getReturnType(); // GenericReflectionType('list', [User::class]) // — `T` resolved through `@extends Collection<User>`.
Supported out of the box:
@template Tand@template T of Foo(bounds parsed but not yet enforced)@param,@return,@var@extends Foo<X>,@implements Foo<X>— including transitive inheritance through PHPextends@phpstan-typealiases- Generics, array shapes (
array{name: string}), unions, intersections, nullables,Foo[] - Short-name resolution through
usestatements (includinguse A as B,use A\{B, C}, grouped imports) self,static,parentresolution against the declaring class
Requirements
- PHP 8.4+
Development
composer install
composer tests # cs:check + test:stan + test:unit
License
MIT — see composer.json.
tcds-io/php-better-generics 适用场景与选型建议
tcds-io/php-better-generics 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 3.25k 次下载、GitHub Stars 达 0, 最近一次更新时间为 2025 年 05 月 08 日, 在 PHP 生态内属于活跃度较高的组件。
我们在过去多个企业项目中使用过 tcds-io/php-better-generics 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 tcds-io/php-better-generics 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
统计信息
- 总下载量: 3.25k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 7
- 依赖项目数: 2
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2025-05-08