gpt4 book ai didi

php - 如何在 PHP 中执行类型提示接口(interface)的契约

转载 作者:可可西里 更新时间:2023-11-01 12:33:19 26 4
gpt4 key购买 nike

让我们想象一下,我们有以下接口(interface)声明。

<?php 
namespace App\Sample;

interface A
{
public function doSomething();
}

和实现接口(interface) 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 将依赖于接口(interface) 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,即使我们类型提示构造函数接受 A,PHP 也允许调用 B 的任何公共(public)方法> 仅限界面。

如何在 PHP 的帮助下避免这种情况,而不是依赖任何团队成员遵守接口(interface)规范?

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

最佳答案

您不能在 PHP 中执行此操作,因为它不会阻止此类方法调用。

您可以使用 PHPStan 等工具来阻止它检测对不保证存在的参数的方法调用。

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

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

关于php - 如何在 PHP 中执行类型提示接口(interface)的契约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51785180/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com