برنامه نویسی

Dependency Injection در PHP به سادگی با یک مثال توضیح داده شده است

من فکر می کنم همه شما شنیده اید تزریق وابستگی در PHP اما آیا شما آن را خوب می دانید؟ اگر این را نخوانید متوجه خواهید شد.

مثال بدون تزریق وابستگی

ابتدا اجازه دهید در مورد مثال بدون تزریق وابستگی صحبت کنیم. سپس اجازه دهید در مورد معایب صحبت کنیم و بیایید در مورد نحوه غلبه بر آنها با Dependency Injection صحبت کنیم

ما به این دو کلاس نیاز داریم

class Vehicle {
    private $make;
    private $model;

    public function __construct($make, $model){
        $this->make = $make;
        $this->model = $model;
    }
}

class Garage {
    private $vehicle;
    private $sku;

    public function __construct($sku, $vehicleMake, $vehicleModel){
        $this->vehicle = new Vehicle($vehicleMake, $vehicleModel);
        $this->sku = $sku;
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه داشته باشید که ما تماس می گیریم وسیله نقلیه کلاس داخل گاراژ کلاس و یک شی ایجاد کنید.

اما این رویکرد ممکن است مشکلاتی ایجاد کند. این سناریو را تصور کنید. تصور کنید باید به جای کلاس اصلی، زیر کلاس اضافه کنیم. این زیر کلاس است،

class ElectricVehicle extends Vehicle {
    private $batteryCapacity;

    public function __construct($make, $model, $batteryCapacity){
        parent::__construct($make, $model);
        $this->batteryCapacity = $batteryCapacity;
    }

    public function getBatteryCapacity() {
        ....
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای استفاده از این پیاده سازی جدید، باید آن را تغییر دهید گاراژ کلاس:

class Garage {
    private $vehicle;
    private $sku;

    public function __construct($sku, $make, $model, $batteryCapacity = null){
        if ($batteryCapacity) {
            $this->vehicle = new ElectricVehicle($make, $model, $batteryCapacity);
        } else {
            $this->vehicle = new Vehicle($make, $model);
        }
        $this->sku = $sku;
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این تغییر منطق شرطی را در داخل وارد می کند گاراژ کلاس، و حفظ آن را پیچیده تر و سخت تر می کند. هر بار نوع جدیدی از وسیله نقلیه اضافه شده است، کلاس Garage باید اصلاح شود.

رویکرد بهبود یافته با تزریق وابستگی

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

class Vehicle {
    private $make;
    private $model;

    public function __construct($make, $model){
        $this->make = $make;
        $this->model = $model;
    }
}

class ElectricVehicle extends Vehicle {
    private $batteryCapacity;

    public function __construct($make, $model, $batteryCapacity){
        parent::__construct($make, $model);
        $this->batteryCapacity = $batteryCapacity;
    }

    public function getBatteryCapacity() {
        ...
    }
}

class Garage {
    private $vehicle;
    private $sku;

    public function __construct($sku, Vehicle $vehicle){
        $this->vehicle = $vehicle;
        $this->sku = $sku;
    }
}

// Create an instance of Vehicle
$vehicle = new Vehicle('Toyota', 'Corolla');
$garage = new Garage('SKU123', $vehicle);

// Create an instance of ElectricVehicle
$electricVehicle = new ElectricVehicle('Tesla', 'Model S', 100);
$electricGarage = new Garage('SKU124', $electricVehicle);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این مثال را با دقت بررسی کنید. بگذارید این را ساده کنیم. تصور کنید ما نیاز جدیدی برای دریافت داریم ظرفیت باتری. در اینجا یک زیر کلاس از کلاس والد ایجاد کرده ایم و تابع را اضافه کرده ایم getBatteryCapacity(). بررسی کنید که ما تغییر نکرده ایم وسیله نقلیه یا گاراژ کلاس این قدرت واقعی Dependency Injection است.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا