از implement برای پیاده سازی Interface ها استفاده میشه
Interface ها رابطهایی هستن که در خودشون یه سری متد بدون پیاده سازی، یعنی متدهایی که فقط امضا دارن و بدنه (کد) ندارن، مثل مورد زیر:
<?php
interface Walkable {
public function move();
public function stop();
}
در ادامه میشه کلاسهای مختلفی داشت که این interface رو پیادهسازی میکنن:
<?php
class Human implements Walkable {
public function move() {
// code...
}
public function stop() {
// code
}
}
class Cat implements Walkable {
public function move() {
// code...
}
public function stop() {
// code
}
}
به این شکل هر کلاسی که interface رو implement کنه موظفه (و باید) که متدهای تعریف شده در interface رو پیادهسازی کنه.
تعریف ساده اش میشه:
Interface رو مثل یه قرارداد در نظر بگیرید
که کلاسهایی که ازش تبعیت میکنند
مجبورند به قوانین اون اینترفیس پایبند باشند.
مثلا در مثال بالا:
Walkable یا توانایی راه رفتن یک قرارداده
که وقتی Human و Cat این قانون رو implement میکنند (یا ازش تبعیت میکنند)
مجبورند متد های move و stop رو داشته باشند (متد هایی که در بدنه قرارداد اومده)
توضیحی که @faridaghili و @ali.bayat بسیار خوب و کامل بود.
اما یه مشکلی که خودم قبلا داشتم سر این اینترفیس و باعث میشد که با خودم بگم خب که چی!؟ همین مثال های دنیای واقعی بود که میزدن.
مثل همین مثال Cat و Human و Walkable
کلا به همین دلیل میگن بهترین روش یادگیری یه زبان، بررسی پروژه های واقعی نوشته شده با اون زبانه. چون مثالی که توش هست یه مثال از کاربرد واقعیه.
حالا اینترفیس در دنیای واقعی کجا کاربرد داره؟
فرض کنید شما یه سیستم کش دارید. خب ممکنه شما توی پروژه نیاز به سیستم های مختلفی از کش نیاز داشته باشید.
مثلا Redis یا memcached یا ehcace. هر سه تای این سه تا ابزار ذخیره سازی و کش هستند.
فرض کنید شما الان از ردیس استفاده میکنید و کدتون داخل برنامه به این شکله:
class Redis {
public function save($key, $value)
{
// Save key & value
}
public function get($key)
{
// Get a key
}
}
$cache = new Redis();
$cache->save("foo", "bar");
echo $cache->get("foo");
خب حالا اگه شما بخواید یه سیستم کش دیگه هم اضافه کنید به سیستم چی میشه؟ خب به راحتی یه کلاس دیگه مینویسیم واسه فرضا memcached:
class Memcached {
public function set($key, $value)
{
// Save key & value
}
public function retrieve($key)
{
// Get a key
}
}
خب مشکل چیه اینجا؟
توی کلاس ردیس برای ذخیره اطلاعات از متد save()
استفاهد کردیم و توی کلاس Memcached از متد set()
. این یعنی مجبوریم کل کد هامون رو هر جا از کش استفاده کردیم تغییر بدیم که اسم save
رو به set
تغییر بدیم.
حالا فرض کن 4 تا سیستم کش داشته باشیم! فاجعه!
اینجاست که میان از اینترفیس استفاده میکنن:
interface CacheInterface {
public function save($key, $value);
public function get($key);
}
اینترفیس میاد به کلاس میگه شما کامل نیستی! و ارور تولید میکنه.
درو واقع به کلاس میگه اگه میخوای واقعا یه سیستم کش باشی، حتما باید متد save()
یا get()
رو داشته باشی تا من قبولت کنم.
کاربرد دیگه اینترفیس تو قسمت تایپ هاست (type-hinting)
public function saveUserInfoInCache(CacheInterface $cache)
{
$cache->save("x", "y");
}
و وقتی میخواید این متد رو صدا بزنید:
$this->saveUserInfoInCache(new Redis());
و اگر به متد saveUserInfoInCache()
هر نوع کلاس دیگه ای (جز کلاس هایی که از CacheInterface پیروی میکنند و در واقع کش هستند) بدید، php یه ارور رو برمیگردونه که تایپ اشتباهه.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟