Каково различие между Абстракцией Класса и Интерфейсы объекта в PHP? Я спрашиваю, потому что, я действительно не вижу точку им обоим, они оба делают то же самое! Так, что преимущества недостатков используют обоих против одного или другого?
Абстракция класса:
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);
}
Вы можете реализовать несколько интерфейсов, но расширить только один класс.
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 Glossary:
Интерфейс позволяет кому-то начать с нуля, чтобы реализовать ваш интерфейс или реализовать ваш интерфейс в каком-то другом коде, чья первоначальная или основная цель была совершенно иной, чем ваш интерфейс. Для них ваш интерфейс является лишь побочным, чем-то, что они должны добавить в свой код, чтобы иметь возможность использовать ваш пакет.
Абстрактный класс, напротив, обеспечивает большую структуру. Он обычно определяет некоторые реализации по умолчанию и предоставляет некоторые инструменты, полезные для полной реализации. Загвоздка в том, что код, использующий его, должен использовать ваш класс в качестве базового. Это может быть очень неудобно, если другие программисты, желающие использовать ваш пакет, уже разработали свою собственную иерархию классов. В Java класс может наследоваться только от одного базового класса.
Вам также стоит взглянуть на этот вопрос - замечание Дэмиена о том, что интерфейс - это контракт, очень важно.
Абстрактный класс может определять реализацию метода в дополнение к определениям методов. Интерфейс может указывать только определение метода.
Множество интерфейсов плюс ваши скрипты не вызывают никаких проблем с родителями.