
本文详细介绍了如何使用phpdoc和psalm为php中存储继承自同一基类的类名字符串数组进行精确注解。通过`class-string
在PHP开发中,我们经常会遇到需要根据特定键动态创建对象实例的场景,例如在工厂模式(Factory Pattern)中。一个常见的实现方式是维护一个数组,将主题或标识符映射到相应的类名字符串。然而,当这些类名字符串所代表的类都继承自一个共同的基类(或实现一个共同的接口)时,如何使用PHPDoc和静态分析工具(如Psalm)正确地注解这个数组,以确保类型安全并避免静态分析错误,就成了一个需要解决的问题。
考虑一个事件工厂(EventFactory)的例子,它根据传入的主题(topic)返回对应的事件实例。这里,我们有一个私有数组$events,它将字符串主题映射到事件类的类名字符串:
<?php
abstract class Event
{
// 假设所有事件类都实现了 createFromData 方法
public static function createFromData(array $data): self
{
// 实际的创建逻辑,例如根据数据填充属性
return new static();
}
}
class PostCreatedEvent extends Event {}
class ExerciseExecutedEvent extends Event {}
class EventFactory
{
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');
}
$eventClassName = ($this->events)[$topic];
// 这里会通过类名字符串调用静态方法
return $eventClassName::createFromData($data);
}
}
?>在这个例子中,PostCreatedEvent和ExerciseExecutedEvent都继承自抽象类Event。当我们使用$eventClassName::createFromData($data)这种动态方式调用静态方法时,如果没有适当的PHPDoc注解,Psalm等静态分析工具可能会无法正确推断$eventClassName的类型,从而报告潜在的错误或警告。
为了解决这个问题,PHPDoc和Psalm提供了class-string
立即学习“PHP免费学习笔记(深入)”;
对于上述的事件工厂场景,我们可以这样注解$events数组:
<?php
abstract class Event
{
public static function createFromData(array $data): self
{
return new static();
}
}
class PostCreatedEvent extends Event {}
class ExerciseExecutedEvent extends Event {}
class EventFactory
{
/**
* @var array<string, class-string<Event>>
*/
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');
}
$eventClassName = ($this->events)[$topic];
return $eventClassName::createFromData($data);
}
}
?>通过这个注解,Psalm就能准确地知道$eventClassName变量(从$events数组中取出)是一个类名字符串,并且这个类名所代表的类一定继承自Event。因此,当调用$eventClassName::createFromData($data)时,Psalm能够正确地推断出createFromData方法存在于Event类(或其子类)中,从而消除潜在的类型错误警告。
为PHP中存储继承自同一基类的类名字符串数组添加PHPDoc注解是提高代码质量和可维护性的重要一步。通过利用@var array
以上就是PHPDoc与Psalm:如何高效注解继承类名的数组的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号