میخوای وارد بازار کار بشی و محصولات خودت رو بفرشی همین الان ثبت نام کن
0

interface در PHP

اینترفیس ها (interfaces) از یک نظر شبیه به کلاس های انتزاعی هستند؛ هر دوی آنها دارای متد های انتزاعی هستند که که در کلاس های فرزند باید بدنه نویسی شوند. از این نظر می توان گفت، اینترفیس ها به نظم کد کمک بزرگی می کنند چرا که کلاس های فرزند را مجبور به بدنه نویسی برای متد های خودشان می کنند.

استفاده از اینترفیس ها معمولا در کار های تیمی نمود پیدا می کند؛ زمانی که مدیر پروژه می خواهد مطمئن شود که تک تک برنامه نویسان و توسعه دهندگان، متد هایی که به آن ها واگذار شده را خواهند نوشت.

البته می توان از اینترفیس ها جهت نظم در پروژه های شخصی نیز استفاده کرد. به عنوان مثال شما می توانید با استفاده از اینترفیس ها خود را ملزم به نوشتن متد ها کنید.

 


چطور interface بسازیم؟

برای ساخت interface ها از کلمه ی interface استفاده می کنیم. کلاسی که از یک interface  ارث می برد با کلمه ی implements مشخص و تعیین می شود. به مثال زیر دقت کنید:

interface Car {
public function setModel($name);

public function getModel();
}

interface ها مانند کلاس های انتزاعی شامل متد های انتزاعی و ثابت ها (constants) هستند اما بر خلاف کلاس های انتزاعی فقط می توانند متد های public داشته باشند و از طرفی نمی توانند هیچ متغیری داشته باشند.

همانطور که گفتیم کلاس هایی که از interface ارث بری دارند، موظف هستند تمام متد هایی که در interface وجود داشته است را کد نویسی کنند، و این مسئله شامل پارامتر ها هم می شود.

به همین دلیل کلاس miniCar در مثال زیر باید تک تک متد ها را بدنه نویسی کند:

public function setModel($name)
{
$this -> model = $name;
}

public function getModel()
{
return $this -> model;
}
}


آیا می توان در یک کلاس چندین interface تعریف کرد؟

بله شما می توانید در یک کلاس بیش از چندین interface داشته باشید. حتما از خودتان می پرسید چرا به چنین چیزی نیاز داریم؟  هر کلاس فرزند فقط می توانست از یک کلاس پدر ارث بری داشته باشد. interface ها این مشکل را دور می زنند. برای نمایش چنین مثالی یک کلاس به نام Vehicle می سازیم.

حالا کلاس فرزند ما در مثال زیر می تواند از هر دو interface ارث بری داشته باشد:

سوال بنیادین: چه زمانی از interface ها استفاده کنیم و چه زمانی از کلاس های انتزاعی؟

پاسخ: بگذارید با یک مثال واقعی به خودمان یاد آوری کنیم که اصلا فایده ی کلاس های انتزاعی چه بود. فرض کنید من یک سیب به شما می دهم:

<?php
class Fruit {
private $color;
public function eat() {
// جویدن
}
public function setColor($c) {
$this->color = $c;
}
}
class Apple extends Fruit {
public function eat() {
// جویدن تا هسته
}
}
class Orange extends Fruit {
public function eat() {
// پوست کردن
// جویدن
}
}

اگر بعد از اینکه یک سیب به شما دادم و شما آن را خوردید از شما بپرسم چه مزه ای داشت، به من چه می گویید؟ قاعدتا شما می گویید که مزه ی سیب می دهد! حالا به کد زیر نگاه کنید:

<?php
$apple = new Apple();
$apple->eat();
// حالا به شما یک میوه می دهم
$fruit = new Fruit();
$fruit->eat();

در کد بالا به شما یک میوه (fruit) دادم. چه مزه ای می دهد؟ طبیعتا این سوال جواب منطقی ندارد! چه میوه ای؟ میوه که یک مفهوم است و به خودی خود مزه ندارد!

بنابراین در کد ها نباید اجازه داشته باشیم تا از کلاس پدر که fruit است، شیء بسازیم چرا که منطقی نیست. ما در قسمت های قبلی این مثال را با یک فروشگاه زدیم و به شما گفتیم اینجاست که از کلاس های انتزاعی (abstract) استفاده می کنیم:

<?php
abstract class Fruit {
private $color;
abstract public function eat(){}
public function setColor($c) {
$this->color = $c;
}
}
?>

بنابراین در کلاس های انتزاعی می توانید متد ها را به صورت انتزاعی تعریف کنید اما در interface ها متد ها همگی انتزاعی هستند.

به علاوه، در کلاس های انتزاعی می توان متد های کاربردی (functional) داشت اما در اینترفیس ها متد ها نمی توانند بدنه داشته باشند. در واقع بدنه شان خالی است و کاری انجام نمی دهند.

منظور از متد کاربردی متدی است که واقعا کاری انجام می دهد و در قسمت بدنه کد هایی دارد. به همین ترتیب یک متغیر کاربردی یعنی یک متغیر واقعی که به طور مثال در خودش مقداری ذخیره می کند. در مثال های بالا و interface هایی که تعریف کرده ایم مشاهده می کنید که متد ها در interface ها بدنه ندارند و فقط تعریف شده اند. مثال:

interface Vehicle {
public function setHasWheels($bool);
public function getHasWheels();
}

در مثال بالا، متد های getHasWheels و setHasWheels خالی هستند و هیچ کاری نمی کنند تا زمانی که در کلاس فرزند تعریف شوند.


خلاصه ی تفاوت ها بین interface و کلاس انتزاعی

تفاوت بین interface ها و کلاس های abstract برای شما در جدول زیر به طور خلاصه تهیه شده است:

 

 

نقطه نظر / دسته بندیاینترفیس هاکلاس های انتزاعی
از نظر کد* متد های انتزاعی* ثابت ها (constants)* متد های انتزاعی* ثابت ها (constants)

* متد های کاربردی (functional)

* متغیر های کاربردی

از نظر access modifierpublicpublicprotected

private

و …

تعداد کلاس های پدریک کلاس می تواند بیش از یک اینترفیس داشته باشدکلاس فرزند فقط از یک پدر ارث بری دارد

بنابراین در دنیای واقعی و هنگام انجام پروژه های واقعی:

  • زمانی که می خواهید توسعه دهندگان تیم شما (و خودتان) حتما در کلاس هایی که می سازند از تعداد خاصی متد استفاده کنند، از interface ها استفاده کنید.
  • زمانی که می خواهید توسعه دهندگان تیم شما (و خودتان) حتما در کلاس هایی که می سازند از تعداد خاصی متد استفاده کنند و می خواهید خودتان چند متد پایه ای را نیز تعریف کنید تا در صورت تمایل از آن ها استفاده کنند، از کلاس های انتزاعی استفاده کنید.

در ضمن اگر از جلسات قبل به خاطر داشته باشید، اگر ما با شرایط خاص (مانند استفاده از access modifier ها یا انتزاعی کردن متد ها) جلوی کلاس های فرزند را نمی گرفتیم، آن ها می توانستند کد های کلاس پدر را override کنند اما از آن جایی که اینترفیس ها نمی توانند کد های کاربردی و فعال داشته باشند، چیزی برای override کردن وجود ندارد و هر فرزند خودش (مانند متد های انتزاعی) بدنه ی کد های خود را بنویسد.

 


 

نظراتتون رو زیر همین پست با ما به اشتراک بگذارید.

 

ارسال دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

×

سلام کاربر عزیز

هر سوالی دارید در این بخش هستیم تا شما رو راهنمائی کنیم

روی لوگومون کلیک کنید

× چطور میتونم کمکتون کنم؟