让我们想象一下,我们有如下的接口声明。
<?php
namespace App\Sample;
interface A
{
public function doSomething();
}
和实现接口A
的类B
。
<?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()
方法成为私有方法,因为它在其他地方是必需的,或者它是第三方库的一部分,我不能更改它。
发布于 2018-08-10 19:11:22
您不能在PHP中这样做,因为它不会阻止这种类型的方法调用。
您可以通过使用PHPStan之类的工具来检测对不一定存在的参数的方法调用,以防止出现这种情况。
在几乎任何语言中,理论上都可以使用语言中的一些功能,但负责程序员团队的人选择不允许这些功能成为团队编写代码的方式。
使用静态分析工具和其他代码质量工具通常是执行这些规则的最佳方式。如果你可以设置它们,最好在预提交钩子上,否则在提交之后在你的自动构建工具中。
https://stackoverflow.com/questions/51785180
复制相似问题