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 است.