gpt4 book ai didi

Php 类型提示不适合接口(interface)和抽象类?

转载 作者:IT王子 更新时间:2023-10-29 00:16:42 26 4
gpt4 key购买 nike

我认为在代码示例中看到问题比首先编写问题要容易得多。这是我的 PHP 代码:

<?php

interface AnInterface
{
public function method();
}

class AClass implements AnInterface
{
public function method()
{
echo __METHOD__;
}
}

abstract class AnAbstractClass
{
abstract public function method( AnInterface $Object );
}

class ConcreteClass extends AnAbstractClass
{
public function method( AClass $Object )
{
$Object->method();
}
}

$Object1 = new ConcreteClass();
$Object2 = new AClass();

$Object1->method( $Object2 );

以上代码导致如下错误:

Fatal error: Declaration of ConcreteClass::method() must be compatible with that of AnAbstractClass::method()

问题是 php 似乎没有将 AnAbstractClass::method 和 ConcreteClass::method 的签名识别为兼容的。难道我做错了什么?谢谢!

最佳答案

php doesn't seem to be recognizing the signatures of AnAbstractClass::method and ConcreteClass::method as compatible.

PHP 是正确的,它们兼容。通过仅允许将 AClass(或其子级)的实例传递给 ConcreteClass::method,您将违反 AnAbstractClass 提供的契约: 它的任何子类都必须接受 AnInterface 作为其 method() 的参数。

如果您的示例有效,并且我有另一个类 BClass 实现 AnInterface,我们会遇到这样一种情况,根据 AnAbstractClassmethod() 应该接受 BClass 的实例,而根据 ConcreteClass,它不应该。

更改 ConcreteClass::method 的签名以匹配 AnAbstractClass::method 的签名。

关于Php 类型提示不适合接口(interface)和抽象类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4567020/

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