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 chungDù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"; }}
publicclass A implements X, Y, Z
=> Đây là điểm cực mạnh.
Là class chưa hoàn chỉnh.
Có thể:
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"; }}
| Interface | Abstract class | |
|---|---|---|
| Mục đích | Contract | Base class |
| Có method body | Hầu như không | Có |
| Có property | Gần như không | Có |
| Constructor | Không | Có |
| Multiple inheritance | Implement nhiều | Chỉ extend 1 |
| Dùng để | Define capability | Share logic/code |
interface Flyable{ public function fly();}
=> Không liên quan họ hàng nhưng cùng khả năng.
abstract class Animal{ public function eat() { echo "eating"; } abstract public function sound();}
=> Chung logic eat().
Ví dụ:
CacheInterfaceLoggerInterfaceQueueInterface
Framework lớn như Laravel dùng rất nhiều interface.
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(); }}
"Làm được gì"
"Là cái gì"
Ví dụ:
FlyableSerializableCacheable=> interface
Còn:
AnimalControllerBaseRepository=> abstract class