gpt4 book ai didi

php - 界面类型提示

转载 作者:可可西里 更新时间:2023-10-31 22:52:12 28 4
gpt4 key购买 nike

为什么类类型提示应该与接口(interface) 100% 相同?
我的意思是,为什么它不能接受实现类作为类型提示?

为了说清楚,

<?php
interface MyInterface
{
public function doMethod(SomeInterface $a)
{
}
}

class MyClass implements MyInterface
{
public function doMethod(ClassThatImplementsSomeInterface $a)
{
}
}

错误: fatal error :MyClass::doMethod() 的声明必须与 MyInterface::doMethod() 的声明兼容

由于类类型提示实现了SomeInterface,我希望它不会违反契约。
我为什么要它?因为接口(interface)灵活的优点。
抽象类也是如此。
如果我重写代码,使方法“do”没有类型提示,我知道它会“修复”它。
但是,不知何故,我认为我应该定义 $a 的类型提示必须实现 SomeInterface 的契约。
而且,为什么我不使用相同的类型提示,即 SomeInterface
那是因为有SomeInterface中不存在的方法是我需要的。
那么,这个限制有什么意义呢?

可重现的键盘:http://codepad.org/2PLd8AmV

最佳答案

答案很简单,您需要能够依赖接口(interface)所需的对象。

现实世界的例子:

接口(interface)需要 APPLE

您现在尝试实现一个类,上面写着I require a GREEN APPLE(它仍然是一个苹果!)。

现在有人试图实现您的接口(interface)并将其放入青苹果的类中。他尝试放入一个与 APPLE 兼容但与 GREEN APPLE 不兼容的 RED APPLE

=> 砰,契约(Contract)被打破了!

编码示例:

interface MyInterface
{
public function doMethod(SomeInterface $a);
}

class MyClass implements MyInterface
{
public function doMethod(ClassThatImplementsSomeInterface $a) { }
}

class DifferentClass implements SomeInterface { }

$ding = new MyClass();
$ding->doMethod(new DifferentClass);

这是行不通的,因为 DifferentClass 不是 ClassThatImplementsSomeInterface!

关于php - 界面类型提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37680448/

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