首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在PHP中强制执行类型提示接口的约定

如何在PHP中强制执行类型提示接口的约定
EN

Stack Overflow用户
提问于 2018-08-10 19:08:34
回答 1查看 443关注 0票数 8

让我们想象一下,我们有如下的接口声明。

代码语言:javascript
复制
<?php 
namespace App\Sample;

interface A
{
    public function doSomething();
}

和实现接口A的类B

代码语言:javascript
复制
<?php
namespace App\Sample;

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

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

C将依赖于接口A

代码语言:javascript
复制
<?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()方法成为私有方法,因为它在其他地方是必需的,或者它是第三方库的一部分,我不能更改它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-10 19:11:22

您不能在PHP中这样做,因为它不会阻止这种类型的方法调用。

您可以通过使用PHPStan之类的工具来检测对不一定存在的参数的方法调用,以防止出现这种情况。

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

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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51785180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档