Trong PHP:

  • interface = chỉ định "phải có gì"
  • abstract class = vừa định nghĩa "phải có gì" vừa có thể chứa code dùng chung

1. Interface

Dùng khi muốn định nghĩa contract.

Ví dụ:

interface PaymentInterface{    public function pay($amount);}

Class implement bắt buộc phải có method đó:

class MomoPayment implements PaymentInterface{    public function pay($amount)    {        echo "Pay by momo: $amount";    }}

Đặc điểm

  • Không chứa state/phần implement chính (PHP hiện đại có default method nhưng ít dùng)
  • Không có property thường
  • Method mặc định là public
  • Một class có thể implement nhiều interface
class A implements X, Y, Z

=> Đây là điểm cực mạnh.


2. Abstract class

Là class chưa hoàn chỉnh.

Có thể:

  • chứa method bình thường
  • chứa property
  • chứa constructor
  • chứa abstract method bắt subclass phải override

Ví dụ:

abstract class Payment{    protected $currency = 'VND';    abstract public function pay($amount);    public function log($amount)    {        echo "Logging: $amount";    }}

Class con:

class MomoPayment extends Payment{    public function pay($amount)    {        echo "Pay momo: $amount";    }}

So sánh nhanh

InterfaceAbstract class
Mục đíchContractBase class
Có method bodyHầu như không
Có propertyGần như không
ConstructorKhông
Multiple inheritanceImplement nhiềuChỉ extend 1
Dùng đểDefine capabilityShare logic/code

Ví dụ dễ hiểu

Interface = khả năng

interface Flyable{    public function fly();}
  • Chim bay được
  • Máy bay bay được
  • Superman bay được

=> Không liên quan họ hàng nhưng cùng khả năng.


Abstract class = cùng họ

abstract class Animal{    public function eat()    {        echo "eating";    }    abstract public function sound();}
  • Dog
  • Cat
  • Tiger

=> Chung logic eat().


Khi nào dùng cái nào?

Dùng interface khi:

  • Muốn loose coupling
  • DI container
  • Service pattern
  • Multiple behavior
  • Team backend lớn

Ví dụ:

CacheInterfaceLoggerInterfaceQueueInterface

Framework lớn như Laravel dùng rất nhiều interface.


Dùng abstract class khi:

  • Muốn share code
  • Có logic chung
  • Có state/property chung
  • Template method pattern

Thực tế senior hay làm

Thường kết hợp cả hai:

interface PaymentInterface{    public function pay($amount);}abstract class BasePayment implements PaymentInterface{    protected function validate()    {        //    }}class MomoPayment extends BasePayment{    public function pay($amount)    {        $this->validate();    }}

Rule nhớ nhanh

Interface

"Làm được gì"

Abstract class

"Là cái gì"


Ví dụ:

  • Flyable
  • Serializable
  • Cacheable

=> interface

Còn:

  • Animal
  • Controller
  • BaseRepository

=> abstract class