Сравнение абстрактного класса и интерфейса в PHP. В чем разница между абстрактным классом и интерфейсом в PHP? Это один из самых распространненых вопросов на собеседованиях.

В этом уроке вы узнаете некоторые важные различия между абстрактным классом и интерфейсом.

Интерфейс в PHP

Интерфейс — это соглашение, контракт или договор. Когда класс реализует интерфейс, это означает, что он содержит публичные методы интерфейса и их реализации.

Когда мы создаем интерфейс в приложении, мы определяем контракт на то, что наш класс может делать, ничего не говоря о том, как этот класс будет это делать.

Пример:

// Defined cacheInterface

interface cacheInterface {
    public function get($key);
    public function set($key,$value);
}

/*
 * A Memcache class implements cacheInterface
 */

class Memcache implements cacheInterface {
    public function get($key){
        // method body
    }

    public function set($key,$value){
	// method body
    }
}

В приведенном выше примере создается cacheInterface, содержащий публичные методы get() и set(). Любой класс, который реализует этот интерфейс, должен определить методы get() и set().

В этом примере класс Memcache реализует cacheInterface. Это означает, что он придерживается контракта и определяет тело методов get() и set(). Аналогично, если какой-либо другой класс кэширования реализует этот интерфейс, он определит методы get() и set().

Абстрактный класс в PHP

Абстрактный класс используется для определения базового каркаса или проекта дочерних классов. Класс, который расширяет абстрактный класс, должен определять некоторые или все его абстрактные методы.

Экземпляры абстрактных классов не могут быть созданы напрямую.

abstract class car {

	abstract public function modelType(); 
	
	public function wheelCount() {
		echo "I have four wheels";
	}
}

class HondaCity extends car{

	public function modelType(){
		echo "HondaCity";
	}
}

$data = new HondaCity;
$data->modelType();
$data->wheelCount();

Сравнение абстрактного класса и интерфейса в PHP

ИнтерфейсАбстрактный класс
Поддерживаем множественное наследованиеНе поддерживаем множественное наследование
Не содержит data membersМожет содержать data members
Не содержит конструкторМожет содержать конструктор
Содержит только объявление методов (сигнатуры методов)Может содержать как сигнатуры методов так и их реализации
Не может иметь модификаторов доступа - все методы по умолчанию публичныеМожет иметь модификаторы доступа
Методы не могут быть статическимиТолько методы, содержащие реализацию, могут быть объявлены статическими

1. Абстрактный класс действует как образец для классов, которые его наследуют. Дочерний класс, который наследует абстрактный класс, должен реализовывать методы, объявленые абстрактными в родительском классе. Абстрактный класс создается только для как элемент иерархии наследования. Это означает, что вы не можете создать объект абстрактного класса.

Интерфейс — это контракт. Он содержит только сигнатуры методов (без тела метода). Класс, который реализует интерфейс, должен реализовывать эти методы.

2. Класс может расширять только один абстрактный класс, тогда как класс может реализовывать несколько интерфейсов.

interface A {}
interface B {}
interface C {}

//A class can implements multiple interfaces
class Base implements A, B, C {}

3. В абстрактном классе мы можем определить переменные экземпляра и конкретные (неабстрактные) методы.

Но в интерфейсе все методы абстрактны. Мы не можем определить переменные экземпляра, но мы можем определить константы в интерфейсе.

4. Абстрактный класс хорош, когда есть некоторые общие черты, которые должны быть общими для всех объектов.

Используйте интерфейс, когда все функции должны быть реализованы по-разному для разных объектов. Все методы cacheInterface будут реализованы по-разному для всех классов.

Например - класс Memcache определяет тело метода get() и set(), но их реализация будет отличается от класса Redis.

Перевел scorp13

Статья является свободным переводом материала сайта https://webrewrite.com/