یکی از مفاهیم شی گرایی همین دو تا کلمه هستن. من تازه باهاشون آشنا شدم. من از ویرگول به عنوان دفترچه استفاده می کنم پس متن پایین الزاما از لحاظ فنی درست نیست!
وقتی میخوایم تجرد در php رو پیاده کنیم باید از دو تا کلمه کلیدی بالا استفاده کنیم. کلمه کلیدی interface یک سطح و البته به نظر من سطح بالاتر رو abstract از لحاظ تجرد به ما میده.
چرا از اینا استفاده می کنیم؟ اولا رعایت اصول برنامه نویسی و ثانیا چیزی که این دو تا کلمه کلیدی به ما میده یعنی جدا سازی منطقی سطوح برنامه و تمیز تر شدن کدها. مثلا با پیاده سازی یک interface ما میتونیم کلاس های موجود در این interface رو توسط برنامه نویسای دیگه پیاده کنیم و یک ساختار مناسب برای برناممون به وجود بیاریم. مثلا فرض بگیرید ما دو سیستم لاگ متفاوت داشته باشیم که در هر دو سیستم یک سری اعمال مشخص پیاده میشن. توابع این اعمال رو بدون تعریف بدنه در interface می نویسیم و بعد آدمای دیگه باید همین توابع رو پیاده کنن نه کم و نه زیاد.
در مورد تفاوت این دو تا این تصویر گویایی هست.
مثال پیاده سازی:
در مورد تفاوت هاشون باید بگم در ساختار interface شما فقط توابع public دارین که بدنه ندارن و کلاس هایی که کلمه کلیدی implements رو دارن میتونن کلاس های interface رو پیاده کنن. ضمنن شما میتونین توی کلاس های خودتون هر چند تا که بخواین کلاس رو implements کنین با یه , که بینشون میزارین.
در مورد abstract ها لزومی نداره همه توابع داخلیتون abstract باشن فقط یه تابع باشه کافیه. ضمنن لزومی هم نداره همه توابعتون بدنه نداشته باشن همون یکی که abstract هست هم کافیه. کلمه کلیدی برای استفاده از کلاس های abstract همون extends خودمونه ولی توجه داشته باشین که باید توابع abstract رو توش پیاده کنین. وقت پیاده سازی جلوی اسم کلاستون وقتی مینویسین extends یادتون باشه بیش تر از یک کلاس abstract رو نمیتونین extends کنین. یعنی توی کلاسی که میخواین بنویسین نمیشه کلاسش رو از دو تا چیز extends کرد فقط باید جلوی extends نام یک کلاس باشه.
قسمت گیج کننده: شما میتونین interface ها رو هم extends کنین و حتی چند تایی هم extends مشکلی نداره ولی یادتون باشه تمام توابع داخلشون رو در کلاس پیاده سازی باید پیاده سازی کنین.
برای مطالعه بهتر:
https://roocket.ir/articles/specifications-abstract-in-php
https://phpenthusiast.com/object-oriented-php-tutorials/abstract-classes-and-methods
https://phpenthusiast.com/object-oriented-php-tutorials/interfaces
https://www.aaronsaray.com/2017/php-interfaces-extend-multiple