微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在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这样的工具来检测对不保证存在的参数的方法调用.

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

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

原文地址:https://www.jb51.cc/php/134621.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐