Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 应该';类型';接口和类都允许继承吗?_Php_Oop_Inheritance_Interface - Fatal编程技术网

Php 应该';类型';接口和类都允许继承吗?

Php 应该';类型';接口和类都允许继承吗?,php,oop,inheritance,interface,Php,Oop,Inheritance,Interface,使用PHP5.5,如果我指定了一个接口层次结构和一个类的并行层次结构,那么最终会得到通过多个关系继承某个类型的子类。这是否意味着设计拙劣?它会制造问题吗 例如,请参见代码: interface foo {} interface bar extends foo {} class myFoo implements foo {} class myBar extends myFoo implements bar {} 在本例中,myBar通过两个关系继承类型“foo”: 它从它的具体父对象(myF

使用PHP5.5,如果我指定了一个接口层次结构和一个类的并行层次结构,那么最终会得到通过多个关系继承某个类型的子类。这是否意味着设计拙劣?它会制造问题吗

例如,请参见代码:

interface foo {}
interface bar extends foo {}

class myFoo implements foo {}
class myBar extends myFoo implements bar {}
在本例中,myBar通过两个关系继承类型“foo”:

  • 它从它的具体父对象(myFoo)继承“foo”
  • 它从它实现的接口(bar)继承“foo”
我之所以在接口和类之间有1对1的关系,是因为我可以在粒度级别用代理和模拟替换具体类。(我的所有方法参数都用接口表示)


我可以停止在接口中使用继承,但这似乎不利于多态性。此外,当我使用接口定义方法签名时(即,不只是建立一个公共类型),它会产生问题

这两种方式都不重要。从接口的“消费者”的角度来考虑,而不是从接口本身的抽象概念来考虑:

function (bar $bar) {
    ...
}
这是橡胶与道路的接口处。此函数感兴趣的是一个对象,该对象的方法与
界面中定义的方法一致。它不关心这个对象如何实现这些方法,只关心它拥有
接口栏定义的所有方法。继承哪些方法也无关紧要,不管是在接口中还是在对象中。实例化对象的总和才是最重要的

话虽如此,您可能还是想多考虑一下接口和类设计。您所做的本身并没有错,但可能有更好的方法来处理接口。不要将接口看作是类的草图,而应将接口看作是功能的定义。为此,再次从这样一个接口的消费者的角度考虑。例如:

function renderThumbnail(Imaginable $item) {
    printf('<img src="%s">', $item->getHighestResolutionImage()->getUrl());
}


interface Imaginable {

    /**
     * @return Image[]
     */
    public function getImages();

    /**
     * @return Image
     */
    public function getHighestResolutionImage();

}
函数渲染缩略图(可想象的$item){
printf(“”,$item->getHighestResolutionImage()->getUrl());
}
可想象的界面{
/**
*@returnimage[]
*/
公共函数getImages();
/**
*@返回图像
*/
公共函数getHighestResolutionImage();
}
这演示了对象可能具有的一种特定功能。任何对象都可能具有关联的图像。任何实现
Imaginable
接口的类都只声明它可以根据请求提供图像。
renderThumbnail
函数只需要具有图像的任何对象。不管传递给它的对象是什么,该对象也可以实现一千个其他接口,并且是任何类型的类,重要的是它可以做这一件特定的事情


如果您从“
-able
”功能接口的角度来考虑它,那么很明显,您可能不会得到两个并行运行的层次结构,这可能是更好的设计。

既然接口没有任何代码,为什么要扩展它?无论如何都不能在接口中重载函数。将foo和bar解耦,您应该会很好。@JvO因为可能有合理的理由想要表达“我希望此接口定义与此其他接口相同的所有方法,但也定义一系列附加方法。”谢谢deceze,回答得很好