本文深入探讨了如何在PHP中使用PHPDoc和`class-string
在现代PHP开发中,静态分析工具如Psalm已成为提升代码质量和减少潜在错误的关键。然而,当处理一些高级模式,例如工厂模式中动态加载类时,类型标注可能会变得复杂。一个常见场景是,我们有一个数组,其值是表示类名的字符串,并且这些类名都继承自一个共同的父类或实现了一个共同的接口。
考虑以下事件工厂的实现。这个工厂根据传入的“主题”字符串,动态地实例化对应的事件类。
PostCreatedEvent::class,
'exercise_executed' => ExerciseExecutedEvent::class,
];
public function fromTopicAndData(string $topic, array $data): Event
{
if (!array_key_exists($topic, $this->events)) {
throw new \Exception('Invalid Topic');
}
$eventClassName = ($this->events)[$topic]; // $eventClassName 是一个字符串
// Psalm 在这里可能会报告错误,因为它不知道 $eventClassName 到底是什么类的字符串,
// 也不知道它是否一定具有 createFromData 静态方法。
return $eventClassName::createFromData($data);
}
}
?>在这个EventFactory中,$events数组的键是主题字符串,值是对应的事件类名(如PostCreatedEvent::class)。所有这些事件类都继承自抽象的Event类,并且我们期望它们都实现了一个静态方法createFromData()。
问题在于,如果没有适当的类型标注,Psalm等静态分析工具在分析$eventClassName::createFromData($data)这一行时,无法确定$eventClassName这个字符串到底代表了哪个类,更无法保证它一定包含createFromData这个静态方法。这会导致Psalm发出警告或错误,降低代码的类型安全。
为了解决这个问题,我们可以利用PHPDoc中的class-string
将此类型应用于$events数组,可以明确告知Psalm数组中存储的类名字符串的类型约束。
> */
private array $events = [
'post_created' => PostCreatedEvent::class,
'exercise_executed' => ExerciseExecutedEvent::class,
];
public function fromTopicAndData(string $topic, array $data): Event
{
if (!array_key_exists($topic, $this->events)) {
throw new \Exception('Invalid Topic');
}
// 经过 PHPDoc 标注后,Psalm 现在知道 $eventClassName 是一个 Event 或其子类的类名字符串
$eventClassName = ($this->events)[$topic];
// Psalm 现在可以正确地验证这个静态方法调用
return $eventClassName::createFromData($data);
}
}
?>标注解析:
通过这样的标注,Psalm就能理解:
父类/接口声明方法:确保在class-string
方法。如果Event类没有声明createFromData(),即使子类实现了,Psalm仍然可能发出警告,因为它只知道$eventClassName是一个Event或其子类的类名,而Event本身不保证有此方法。通常,抽象类或接口是声明这些共享方法的理想场所。
abstract class Event
{
// 明确声明静态方法,即使是抽象的,也告知了Psalm其存在
abstract public static function createFromData(array $data): self;
}类型安全性:class-string
Psalm配置:确保你的Psalm配置(psalm.xml)已正确设置,以便它能够分析你的代码并识别这些PHPDoc标注。
通过在PHPDoc中使用@var array
# php
# 工具
# php开发
# String
# Array
# 父类
# 子类
# xml
# 字符串
# 存储类
# 继承
# 接口
# class
# Event
# 字符串类型
# var
# 事件
# this
# 低代码
# 是一个
# 或其
# 实现了
# 就能
# 此类
# 正确地
# 的是
# 组中
# 都是
相关文章:
如何在新浪SAE免费搭建个人博客?
如何在Golang中使用replace替换模块_指定本地或远程路径
存储型VPS适合搭建中小型网站吗?
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
微信小程序制作网站有哪些,微信小程序需要做网站吗?
IOS倒计时设置UIButton标题title的抖动问题
建站主机数据库如何配置才能提升网站性能?
*服务器网站为何频现安全漏洞?
如何通过西部建站助手安装IIS服务器?
高防服务器:AI智能防御DDoS攻击与数据安全保障
网站按钮制作软件,如何实现网页中按钮的自动点击?
如何选择高效响应式自助建站源码系统?
如何在VPS电脑上快速搭建网站?
潮流网站制作头像软件下载,适合母子的网名有哪些?
昆明高端网站制作公司,昆明公租房申请网上登录入口?
电商网站制作公司有哪些,1688网是什么意思?
历史网站制作软件,华为如何找回被删除的网站?
如何用免费手机建站系统零基础打造专业网站?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
如何快速搭建高效服务器建站系统?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
兔展官网 在线制作,怎样制作微信请帖?
如何在西部数码注册域名并快速搭建网站?
东莞专业制作网站的公司,东莞大学生网的网址是什么?
如何通过虚拟主机空间快速建站?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
如何在七牛云存储上搭建网站并设置自定义域名?
建站主机与服务器功能差异如何区分?
移民网站制作流程,怎么看加拿大移民官网?
c++ stringstream用法详解_c++字符串与数字转换利器
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
深圳网站制作的公司有哪些,dido官方网站?
建站168自助建站系统:快速模板定制与SEO优化指南
公司门户网站制作流程,华为官网怎么做?
南平网站制作公司,2025年南平市事业单位报名时间?
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站主机选哪家性价比最高?
济南网站制作的价格,历城一职专官方网站?
如何在服务器上三步完成建站并提升流量?
香港服务器网站推广:SEO优化与外贸独立站搭建策略
如何通过建站之星自助学习解决操作问题?
网站app免费制作软件,能免费看各大网站视频的手机app?
如何有效防御Web建站篡改攻击?
如何高效生成建站之星成品网站源码?
*请认真填写需求信息,我们会在24小时内与您取得联系。