آفلاین
user-avatar

اینترفیس و implements

PHP -
8 ماه پیش
توسط Amir m آپدیت شد
آفلاین
user-avatar
ali jvn. ( 12062 تجربه )
8 ماه پیش
تخصص : توسعه دهنده وب (back-end)

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

آفلاین
user-avatar
فرید عقیلی ( 5770 تجربه )
8 ماه پیش
تخصص : طراح و توسعه دهنده وب

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

آفلاین
user-avatar
ali jvn. ( 12062 تجربه )
8 ماه پیش
تخصص : توسعه دهنده وب (back-end)

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

آفلاین
user-avatar
علی بیات ( 371368 تجربه )
8 ماه پیش
تخصص : توسعه دهنده ارشد وب

@alijavanmardi1996

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

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

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

آفلاین
user-avatar
Amir m ( 20150 تجربه )
8 ماه پیش
تخصص : برنامه نویس

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

برای ارسال پاسخ باید وارد سایت شوید