jiripudil / phpstan-sealed-classes
PHPStan的密封类支持。
1.2.0
2024-05-14 18:29 UTC
Requires
- php: ^8.1
- phpstan/phpstan: ^1.10
Requires (Dev)
README
此扩展为PHPStan添加了对密封类和接口的支持。
安装
要使用此扩展,通过Composer要求它
composer require --dev jiripudil/phpstan-sealed-classes
如果您正在使用phpstan/extension-installer
,此扩展的配置将自动启用。
否则,您需要在您的phpstan.neon
中显式包含它
includes: - vendor/jiripudil/phpstan-sealed-classes/extension.neon
使用方法
密封类和接口允许开发人员限制类层次结构:一个密封类只能被明确允许继承的类继承。这同样适用于密封接口及其实现。在某种程度上,密封类类似于枚举,但有一个重要区别:虽然枚举是单例,密封类的子类可以有多个实例,每个实例都有自己的状态。
您可以通过将#[Sealed]
属性赋予类或接口来将其密封。该属性接受一个允许的子类或实现列表
<?php use JiriPudil\SealedClasses\Sealed; #[Sealed(permits: [AllowedImplementation::class, AnotherImplementation::class])] interface SealedInterface {} class AllowedImplementation implements SealedInterface {} class AnotherImplementation implements SealedInterface {} class DisallowedImplementation implements SealedInterface {}
前两个类将被允许,但PHPStan将为第三个报告错误
------ ----------------------------------------------------------------------------------
Line sealed-interface.php
------ ----------------------------------------------------------------------------------
10 Type DisallowedImplementation is not allowed to be a subtype of SealedInterface.
------ ----------------------------------------------------------------------------------
请注意,这些限制不适用于间接子类。如果一个密封类的直接子类本身不是密封的,它可以进一步扩展而不会引发任何错误。此代码是完全正确的
<?php use JiriPudil\SealedClasses\Sealed; #[Sealed(permits: [AllowedDescendant::class])] abstract class SealedClass {} class AllowedDescendant extends SealedClass {} class IndirectDescendant extends AllowedDescendant {}