PHP中的Class Abstraction和Object Interfaces有什么区别?我问,因为,我并没有真正看到他们两个人的意思,他们都做同样的事情!那么,使用这两种方法的劣势有哪些优势呢?
班级抽象:
abstract class aClass
{
// Force extending class to define these methods
abstract public function setVariable($name, $var);
abstract public function getHtml($template);
}
对象界面:
interface iClass
{
// Force impementing class to define these methods
public function setVariable($name, $var);
public function getHtml($template);
}
答案 0 :(得分:20)
您可以实现多个接口,但只能扩展一个类。
class MyClass extends MyAbstract implements MyInterface1, MyInterface2, MyInterface3 { }
class MyClass extends MyAbstract1, MyAbstract2 implements MyInterface { }
此外,界面无法实现。
abstract class MyClass {
function doSomething() {
echo "I can give this method an implementation as this is an abstract class";
}
}
interface MyClass {
function doSomething() {
echo "I can NOT give this method an implementation as this is an interface";
}
}
界面允许某人从头开始实现您的界面或在其他原始或主要用途与您的界面完全不同的其他代码中实现您的界面。对他们而言,您的界面只是偶然的,必须添加到他们的代码才能使用您的包。
相比之下,抽象类提供了更多结构。它通常定义一些默认实现,并提供一些对完整实现有用的工具。问题是,使用它的代码必须使用您的类作为基础。如果其他想要使用您的包的程序员已经独立开发了自己的类层次结构,那么这可能会非常不方便。在Java中,类只能从一个基类继承。
你还应该看看this question - Damien关于接口如何成为合同的观点是重要的。
答案 1 :(得分:3)
除了方法定义之外,抽象类还可以定义方法实现。 接力只能指定方法定义。
答案 2 :(得分:0)
多个界面加上你的脚本不会遇到任何父混淆。