千家信息网

PHP中的泛型使用实例分析

发表于:2026-11-05 作者:千家信息网编辑
千家信息网最后更新 2026年11月05日,这篇文章主要介绍"PHP中的泛型使用实例分析",在日常操作中,相信很多人在PHP中的泛型使用实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"PHP中的泛型使用实例
千家信息网最后更新 2026年11月05日PHP中的泛型使用实例分析

这篇文章主要介绍"PHP中的泛型使用实例分析",在日常操作中,相信很多人在PHP中的泛型使用实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"PHP中的泛型使用实例分析"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

深入泛型

泛型示例

$users = new Collection();$slugs = new Collection();

集合 它们可能是解释泛型的最简单方法,但它们也是每个人在讨论泛型时都会谈论的示例。人们通常认为「泛型」和「具有类型的集合」是一回事。绝对不是这样。

所以让我们再看两个例子。

这是一个名为「app」的函数--如果你使用像 Laravel 这样的框架,它可能看起来很熟悉:这个函数接受一个类名,并使用依赖容器解析该类的一个实例:

function app(string $className): mixed{    return Container::get($className);}

现在,你不需要知道容器是如何工作的,重要的是这个函数会给你一个你请求的类的实例。

所以,基本上,它是一个通用函数;一个返回类型取决于你给它的类名。如果我们的 IDE 和其他静态分析器也明白,如果我给这个函数提供类名「UserRepository」,我希望返回一个 UserRepository 的实例,而不是别的,那就太酷了:

function app(string $className): mixed{ /* … */ }app(UserRepository::class); // ?

好吧,泛型允许我们这样做。

我想现在是提一下我一直保守秘密的好时机,就像: 我在 上一篇 中提到 PHP 中不存在泛型;好吧,这并不完全正确。那里的所有静态分析器--无需运行即可读取代码的工具,像你的 IDE 之类的工具--他们允许将 doc 块注释用于泛型:

/** * @template Type * @param class-string $className * @return Type */function app(string $className): mixed{ /* … */ }

诚然:这不是最完美的语法,所有静态分析器都依赖于一个简单的协议,即这是没有官方规范语法; 但是:它有效。PHP 世界中最大的三个静态分析器:PhpStorm、Psalm 和 PhpStan,都在一定程度上理解这种语法。

像 PhpStorm 这样的 IDE 使用它,以便在程序员编写代码时向他们提供反馈,而像 Psalm 和 PhpStan 这样的工具使用它,来批量分析你的代码库并检测潜在的 bug,主要基于类型定义。

所以实际上,我们可以构建这个 app 函数,使我们的工具不再在黑暗中运行。 当然,PHP 本身并不能保证返回类型是正确的,因为 PHP 不会在运行时对该函数进行类型检查; 但是,如果我们可以相信我们的静态分析器是正确的,那么在运行它时,这段代码就很少--甚至没有机会被中断。

这就是静态分析令人难以置信的力量:实际上,我们可以确定,无需运行我们的代码; 其中大部分将按预期工作。 所有这一切都归功于类型--包括泛型。

让我们来看一个更复杂的例子:

Attributes::in(MyController::class)    ->filter(RouteAttribute::class)    ->newInstance()    ->

在这里,我们有一个可以"查询"属性并即时实例化它们的类。 如果你在知道它们的反射 API 相当冗长之前使用过属性,那么我发现这种辅助类非常有用。

当我们使用 filter 方法时,我们给它一个属性的类名; 然后调用 newInstance 方法,我们知道结果将是我们过滤类的一个实例。 再说一遍:如果我们的 IDE 能理解我们在说什么,那就太好了。

你猜对了:泛型允许我们这样做:

/** @template AttributeType */class Attributes{    /**     * @template InputType     * @param class-string $className     * @return self     */    public function filter(string $className): self    { /* … */ }    /**     * @return AttributeType      */       public function newInstance(): mixed    { /* … */ }    // …}

到此,关于"PHP中的泛型使用实例分析"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

分析 实例 函数 类型 静态 代码 分析器 运行 实例分析 工具 方法 类名 学习 属性 语法 例子 实际 实际上 容器 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 精品咖啡豆 科技金融是不是互联网金融 美国互联网保险保险科技 关于新基建和互联网科技 科技制造互联网公司 互联网 科技公司 互联网与未来科技 互联网女皇 腾讯科技 亿账通互联网科技 深圳期待互联网科技 湖南洣水互联网科技有限公司扣款 银川新华互联网科技职业技术培训学校图片 互联网大会黑科技排名 国大互联网教育科技有限公司工作 元气玛特互联网科技公司是外包吗 深圳互联网科技的发展 互联网营销推广黑科技 21世纪互联网科技成就 现代互联网科技公司 武汉亿视互联网科技有限公司 互联网科技公司税收优惠 互联网络科技有限公司 互联网科技论坛 哈尔滨屹滨互联网科技有限公司 互联网保险科技创业 卓翼科技产业互联网合作 国大互联网教育科技有限公司薪资 元气玛特互联网科技公司是外包吗 互联网对科技影响 利用互联网等科技手段
0