jiripudil/phpstan-sealed-classes

PHPStan的密封类支持。

资助包维护!
jiripudil

安装数: 64,482

依赖者: 2

建议者: 0

安全: 0

星标: 30

关注者: 5

分支: 0

开放问题: 1

类型:phpstan-extension

1.2.0 2024-05-14 18:29 UTC

This package is auto-updated.

Last update: 2024-09-14 19:09:37 UTC


README

Build Status latest version license monthly downloads downloads total

此扩展为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 {}