باسلام و عرض خسته نباشید
لطفا توضیح میدید که چرا در پارامتر ورودی __construct یک آبجکت از interface ایجاد کردیم؟
public function __construct(DatabaseConnectionInterface $connection)
{
$this->connection = $connection->getConnection();
}
سلام
همونطور که بقیه دوستان هم گفتن این مورد برای جداسازی هرچه بیشتر ماژولهای مختلف و کم کردن وابستگی به هم دیگه هستش، این در واقع اصل پنجم SOLID هستش به نام Dependency Inversion که ما داخل کلاسمون به جای اینکه مستقیما از کلاسی که پیادهسازی شده و میشه از اون آبجکت ساخت، استفاده کنیم، میایم و از اینترفیس اون که در واقع میشه یک قرارداد استفاده میکنیم. مزیتی که به ما میده این هستش که شاید شما در آینده نیاز باشه که به جای استفاده از مثلا Mysql با این شکل پیادهسازی بخواید از Postgres یا Mongo و یا هر دیتابیس دیگه استفاده کنید، در این حالت اون کلاس جدید شما قرار داد DatabaseConnection رو پیادهسازی میکنه و شما در داخل برنامهتون میاید و کلاس جدید رو بهش پاس میدید، در این حالت کلاسی که داره از اون DatabaseConnection استفاده میکنید دست نخورده باقی میمونه و نیازی نیست شما هیچ تغییر دیگهای در اون انجام بدید.
مثال دنیای واقعی اون میتونه ماشینهای دوگانهسوز باشن که شما برای اینکه بخواین به ماشین دستور بدید که الان از بنزین استفاده نکن و مثلا از گاز استفاده کن با یک دکمه این کار رو انجام میدین به جای اینکه بخواید برید و موتور رو باز کنید و تغییراتی داخل موتور بدید.
سلام ,
همونطور که می دونید interface ها می تونن متد های یک کلاس رو به طور دقیق مشخص کنند, مثل اسم متد , ورودی ها یا همون آرگومان ها , نوع داده خروجی متد و ..
در کد بالا درواقع داریم میگیم که شی دریافتی باید با interface نوشته شده مچ شده باشه یعنی متد های تعریف شده در interface , باید در شی ورودی هم باید وجود داشته باشه.
در اصطلاح می گیم : ورودی باید از نوع همون interface یا کلاس باشه.
با این کار ما میتوینم از متد های یک شی که به یک کلاس تزریق شده , از اون متدها استفاده کنیم.
سلام و احترام
هدف اصلی این کار اینکه که ما آبجکت هایی از کلاس هایی رو دریافت کنیم که فرزند اینترفیس DatabaseConnectio nInterface هستند
برای مثال فرزند های این اینترفیس میتونن دیتابیس هایی مثل mysql - mongodb و.. باشند و از اون جایی که این کلاس ها فرزند DatabaseConnectionInterface هستند پس مطمئنیم که همشون متدهای پدر رو دارند و در صورت نیاز میتونن جای هم دیگه کار کنن
مثلا نوع ورودی اون construct میتونه شئ mysql باشه چون پدرش DatabaseConnectionInterface است و اگه فردا ما posgres رو دادیم مطمئنیم که پدرش اینترفیس DatabaseConnectionInterface هست و دوباره متدهایی که پدر مشخص کرده رو داره و میتونه راحت جای دیتابیس دیگه کار کنه