如何在PHP中强制实现类型提示接口的契约

前端之家收集整理的这篇文章主要介绍了如何在PHP中强制实现类型提示接口的契约前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
让我们想象一下,我们有以下接口声明.
<?PHP 
namespace App\Sample;

interface A
{
    public function doSomething();
}

和B类实现接口A.

<?PHP
namespace App\Sample;

class B implements A
{
    public function doSomething()
    {
        //do something
    }

    public function doBOnlyThing()
    {
        //do thing that specific to B
    }  
}

C类将取决于接口A.

<?PHP
namespace App\Sample;

class C
{
    private $a;

    public function __construct(A $a)
    {
        $this->a = $a;
    }

    public function doManyThing()
    {
        //this call is OK
        $this->a->doSomething();

        //if $this->a is instance of B,//PHP does allow following call
        //how to prevent this?
        $this->a->doBOnlyThing();            
    }  
}

...
(new C(new B()))->doManyThing();

如果实例类B被传递给C,那么PHP确实允许调用B的任何公共方法,即使我们只输入构造函数来接受A接口.

如何在PHP的帮助下防止这种情况,而不是依赖任何团队成员来遵守接口规范?

更新:让我们假设我不能将doBOnlyThing()方法设为私有,因为它在其他地方是必需的,或者它是我无法更改的第三方库的一部分.

你不能用PHP来做,因为它不会阻止这种类型的方法调用.

您可以通过使用像PHPStan这样的工具来检测对不保证存在的参数的方法调用.

在几乎任何语言中,语言中都有可以使用的功能,但是程序员团队的负责人选择不允许这些功能成为团队编写代码的方式.

使用静态分析工具和其他代码质量工具通常是实施这些规则的最佳方式.最好在预提交钩子上,如果你可以设置它们,否则在提交完成后的自动构建工具中.

猜你在找的PHP相关文章