Интерфейс

// содержит инструкции что нужно сделать но не указывает как
// все методы в интерфейсе должны быть реализованы в классах
// все методы в интерфейсе должны быть публичными
namespace App;

interface DebtCollector {

  public int $x; // так нельзя, бан. свойства заблокированы
  public const CONST = 1; // константы разрешены
  // но их нельзя переопределить в классе (наследование)
  
  public function collect(float $owedAmount): float;
  
}

/*****/
class Rocky implements DebtCollector {
  public function collect(float $owedAmount): float {
    return $owedAmount * 0.65;
  }
}

class CollectionAgency implements DebtCollector { // можно много сразу
  public function collect(float $owedAmount): float{
    $guaranteed = $owedAmount * 0.5;
    
    return mt_rand($guaranteed, $owedAmount); // просто рандомный ответ
  
  }
}

class DebtCollectionService{

  public function collectDebt(DebtCollector $collector){ // тут передаем интерфейс
  //теперь этот класс не заботится о конкретной реализации
  //интерфейс вызовет нужный метод переданного класса
  //это же называют полиморфизмом
    $ownedAmount = mt_rand(100, 1000);
    $collectedAmount = $collector->collect($owedAmount);
    
    echo 'Collected $'. $collectedAmount . ' out of $' . $owedAmount . PHP_EOL;
  }
  
}

/*****/
// где то в коде

$service= new \App\DebtCollectionService();

echo $service->collectDebt(new \App\CollectionAgency()) . PHP_EOL;
echo $service->collectDebt(new \App\Rocky()) . PHP_EOL;

//реализация одной и той же идеи в классах может быть разной
//интерфейс может принимать любой из них в качестве аргумента

Расширения и наследования интерфейсов

// так можно
class CollectionAgency implements DebtCollector, AnotherInterface {}

// и так можно
interface DebtCollector extends AnotherInterface, AndAnotherInterface  {}

Отличия от абстракции

Абстрактный класс может
содержать реализации методов
свойства
приватные и протектед методы
расширяет только один класс

Интерфейс
содержит только объявление метода
содержить только методы и константы
только паблик методы
класс может реализовывать несколько интерфейсов