加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 18:07:06 所属栏目:PHP教程 来源:网络整理
导读:让我们想象一下,我们有以下接口声明. ?php namespace AppSample;interface A{ public function doSomething();} 和B类实现接口A. ?phpnamespace AppSample;class B implements A{ public function doSomething() { //do something } public function doBOn
让我们想象一下,我们有以下接口声明.
<?php 
namespace AppSample;

interface A
{
    public function doSomething();
}

和B类实现接口A.

<?php
namespace AppSample;

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

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

C类将取决于接口A.

<?php
namespace AppSample;

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读