رابط (interface)

رابط ها شبیه به کلاسها هستند اما فقط شامل تعاریفی برای متدها و خواص (Property) می باشند. رابط ها را می توان به عنوان پلاگین های کلاس ها در نظر گرفت. کلاسی که یک رابط خاص را پیاده سازی می کند لازم است که کدهایی برای اجرا توسط اعضا و متدهای آن فراهم کند چون اعضا و متدهای رابط هیچ کد اجرایی در بدنه خود ندارند. اجازه دهید که نحوه تعریف و استفاده از یک رابط در کلاس را توضیح دهیم :

   1: <?php
   2:     interface ISample                                          
   3:     {                                                          
   4:         function ShowMessage($message);                 
   5:     }                                                          
   6:                                                                
   7:     class Sample implements ISample                            
   8:     {                                                          
   9:         public function ShowMessage($message)                  
  10:         {                                                      
  11:             echo $message;                             
  12:         }                                                      
  13:     }                                                          
  14:                                                      
  15:     $sample = new Sample();                                       
  16:     $sample->ShowMessage("Implemented the ISample Interface!");
  17: ?>
Implemented the ISample Interface!

در خطوط 5-2 یک رابط به نام ISample تعریف کرده ایم. بر طبق قراردادهای نامگذاری، رابط ها به شیوه پاسکال نامگذاری می شوند و همه آنها باید با حرف I شروع شوند. یک متد در داخل بدنه رابط تعریف می کنیم (خط 4). به این نکته توجه کنید که متد تعریف شده فاقد بدنه است و در آخر ان باید از سیمیکولن استفاده شود.
وقتی که متد را در داخل رابط تعریف می کنید فقط لازم است که عنوان متد (نوع ، نام و پارامترهای آن) را بنویسید. به این نکته نیز توجه کنید که متدها و خواص تعریف شده در داخل رابط سطح دسترسی ندارند چون باید همیشه هنگام اجرای کلاسها در دسترس باشند. برای پیاده سازی یک interface توسط یک کلاس از کلمه کلیدی implements استفاده می شود. کلاسی که اینترفیس را اجرا می کند کدهای واقعی را برای اعضای آن فراهم می کند. همانطور که در مثال بالا می بینید کلاس Sample ، متد ShowMessage() رابط ISample را اجرا و تغذیه می کند. می توان چند رابط را به وسیله یک کلاس پیاده سازی کرد.

class Sample implements ISample1, ISample2, ISample3
{
   //Implement all interfaces
}

درست است که می توان از چند رابط در کلاس استفاده کرد ولی باید مطمئن شد که کلاس می تواند همه اعضای رابطها را تغذیه کند. اگر یک کلاس از کلاس پایه ارث ببرد و در عین حال از رابط ها هم استفاده کند، در این صورت باید نام کلاس پایه قبل از نام رابط ها ذکر شود. به شکل زیر :

class Sample extends BaseClass implements ISample1, ISample2
{
}

همچنین می توان از عملگر instanceof برای چک کردن اینکه آیا یک شی خاص از یک رابط استفاده می کند یا نه استفاده کرد :

$sample = new Sample();

if(sample instanceof ISample)
{
   echo "sample implements the ISample Interface!";
}

نکته دیگر اینکه نمی توان از یک رابط نمونه ای ایجاد کرد چون رابط ها دارای سازنده نیستند، مثلا کد زیر اشتباه است :

$isample = new ISample();

رابطها حتی می توانند از رابطهای دیگر ارث بری کنند. به مثال زیر توجه کنید :

   1: <?php
   2:     interface IBase
   3:     {
   4:         function BaseMethod();
   5:     }
   6: 
   7:     interface ISample extends IBase
   8:     {
   9:         function ShowMessage($message);
  10:     }
  11: 
  12:     class Sample implements ISample
  13:     {
  14:         public function ShowMessage($message)
  15:         {
  16:             echo($message);
  17:         }
  18: 
  19:         public function BaseMethod()
  20:         {
  21:             echo "Method from base interface!";
  22:         }
  23:     }
  24: 
  25: 
  26:     $sample = new Sample();
  27: 
  28:     $sample -> ShowMessage("Implemented the ISample Interface!");
  29:     echo '<br/>';
  30:     $sample -> BaseMethod();                                                                             
  31: ?>
Implemented the ISample Interface!
Method from base interface!

مشاهده می کنید که حتی اگر کلاس Sample فقط رابط ISample را پیاده سازی کند، لازم است که همه اعضای IBase را هم پیاده سازی کند چون ISample از آن ارث بری می کند (خط 7).

لطفا اگر نظر، پیشنهاد و یا انتقادی در باره مطلب بالا دارید در قسمت زیر مطرح بفرمایید.