ali jvn.
5 سال پیش توسط ali jvn. مطرح شد
4 پاسخ

اینترفیس و implements

سلام
می خاستم بدونم چه زمانی از implement استفاده میشه و دقیقا چه کاری انجام میده.
با تشکر


ثبت پرسش جدید
فرید عقیلی
تخصص : طراح و توسعه دهنده وب
@faridaghili 5 سال پیش مطرح شد
0

از 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 رو پیاده‌سازی کنه.


ali jvn.
تخصص : توسعه دهنده وب (back-end)
@alijavanmardi 5 سال پیش مطرح شد
0

@faridaghili
سپاس از توضیح خوبتون


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
0

@alijavanmardi1996

تعریف ساده اش میشه:

Interface رو مثل یه قرارداد در نظر بگیرید
که کلاسهایی که ازش تبعیت میکنند
مجبورند به قوانین اون اینترفیس پایبند باشند.

مثلا در مثال بالا:
Walkable یا توانایی راه رفتن یک قرارداده
که وقتی Human و Cat این قانون رو implement میکنند (یا ازش تبعیت میکنند)
مجبورند متد های move و stop رو داشته باشند (متد هایی که در بدنه قرارداد اومده)


Amir m
تخصص : برنامه نویس
@proamirm 5 سال پیش مطرح شد
0

توضیحی که @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 یه ارور رو برمیگردونه که تایپ اشتباهه.


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام