ابسترکشن (Abstraction) که در منابع فارسی به آن «انتزاع» هم می‌گویند، پنهان کردن جزئیات غیرضروری و ارائه قراردادی واضح برای قابلیت‌های ضروری است. ابسترکشن به PHP محدود نیست و در پایتون، Go، C#، Java و بسیاری زبان‌های دیگر وجود دارد.

فرق Abstract Class با Interface

ویژگیAbstract ClassInterface
هدفاشتراک قرارداد و گاهی پیاده‌سازی پیش‌فرضتعریف قابلیت یا قرارداد مورد انتظار
Stateمعمولا می‌تواند State و Constructor داشته باشددر زبان‌ها قواعد متفاوتی دارد و معمولا محور آن قرارداد است
ارث‌بریدر بسیاری از زبان‌ها فقط یک کلاس پایهمی‌توان چند Interface را پیاده‌سازی کرد
مناسب برایچند نوع دارای رفتار مشترک واقعیچند پیاده‌سازی متفاوت با قابلیت مشترک

نمونه PHP

interface PaymentGateway { public function charge(int $amount): void; }
abstract class LoggedGateway implements PaymentGateway {
    protected function log(int $amount): void { /* log request */ }
}

نمونه Python

from abc import ABC, abstractmethod
class PaymentGateway(ABC):
    @abstractmethod
    def charge(self, amount: int) -> None: ...

نمونه Go

type PaymentGateway interface { Charge(amount int64) error }
// Go uses interfaces and composition rather than class inheritance.

نمونه C#

public interface IPaymentGateway { Task ChargeAsync(decimal amount); }
public abstract class GatewayBase {
    protected void Log(string message) { /* ... */ }
}

اشتباه رایج

هر Interface یا کلاس Abstract لزوما انتزاع خوب نیست. اگر قرارداد مفیدی ایجاد نکند، فقط تعداد فایل‌ها و وابستگی‌ها افزایش پیدا می‌کند.

مقایسه با اینترفیس، انکپسولیشن و تزریق وابستگی را ببینید.