برنامه نویسی شیء گرا در PHP قسمت سوم :: ارث بری

اردیبهشت ۲۷, ۱۳۹۱ توسط : سعید

در مقالات قبل با مقدمات شیء گرایی و نحوه دسترسی به اعضای یک شیء رو با هم بررسی کردیم.همینطور در مورد ارث بری توضیحات کمی دادم. تصمیم گرفتم در این مقاله به بحث ارث بری به طور مفصل بپردازم.

چرا ارث بری؟

اگر تجربه کار با برنامه نویسی شیء گرا رو نداشته باشید به احتمال زیاد این سوال براتون پیش اومده که چرا ارث بری یکی از مهمترین مباحث شیء گرایی محسوب میشه و چه مزیتهایی داره؟

از مزیتهای ارث بری در برنامه نویسی شیء گرا میشه به نکات زیر اشاره کرد :
۱- هنگامی که یک کلاس مینویسید ممکنه کلاسهای دیگری هم باشند که متدها و متغیرهای مشابهی باهم داشته باشند. بر این اساس از ارث بری برای کم کردن مقدار کدها استفاده میکنیم.
۲ – وقتی که چند کلاس فرزند از یک کلاس مادر ارث بری میکنن پیدا کردن خطاهای به وجود اومده بسیار راحتتره

کلمه کلیدی extends

برای ارث بری از کلمه کلیدی extends استفاده میکنیم.

 
class Database
{
     // code . . .
}
class Users extends Database
{
//code...
}

همینطور که در مثال بالا میبینید کلاس Users از کلاس Database با استفاده از کلمه کلیدی extends ارث بری کرده. یعنی کلاس Users به متدها و متغیرهایی که به صورت public  یا protected در کلاس Database تعریف شدن دسترسی داره.

override کردن متدها و متغیر ها

فرض کنید شما در کلاس مادر(پدر ، اصلی و هر چی دلتون میخواد بهش بگید) یک تابع داری با نام getName

class Database

{

     public function getName()

    {

         return __CLASS__;

    }

}

حالا میخوایم یک کلاس فرزند ایجاد کنیم :

class User extends Database

{

public function getName()

{

return __CLASS__;

}

}

در مثال بالا متد getName در هر دو کلاس وجود داره.هنگامی که کد زیر رو اجرا میکنیم نام کلاس فرزند رو در خروجی مشاهده میکنیم :

$user = new Users();
echo $user->getName();

شاید در بعضی مواقع نیاز باشه که از متدها و متغیر های کلاس اصلی در کلاس فرزند استفاده کنیم.با استفاده از کلمه کلیدی parent میتونیم اینکارو انجام بدیم.

مثال :

یک کلاس دیتابیس رو در نظر بگیرید.این کلاس در سازنده (__construct) عمل اتصال به دیتابیس رو انجام میده :

class Database

{

public $name ;

public function __construct($table , $pk)

{

mysql_connect('localhost','root','123');

mysql_select_db('Data');

}

}

کلاس بالا کلاس اصلی ماست که اتصال به دیتابیس رو در سازنده اش انجام دادیم. حالا فرض کنید که برای هر یک از جداول دیتابیس باید یک کلاس جدا بسازیم.کلاس Users رو در نظر بگیرید :

class Users extends Database

{

function __construct($table , $pk)

{

parent::__construct($table , $pk );

}

}

درسازنده  کلاس Users با استفاده از کلمه کلیدی parent:: به سازنده کلاس اصلی دسترسی پیدا کردیم. اما اگر این کار رو انجام نمیدادیم به خاطر اینکه سازنده رو در کلاس فرزند دوباره نوشتیم سازنده کلاس مادر اجرا نمیشد.پس با استفاده از parent:: سازنده کلاس مادر رو فراخوانی کردیم تا عمل اتصال به دیتابیس به درستی صورت بگیره.

کلمه کلیدی instanceOf

در PHP 5 یک عملگر جدید با نام instanceOf  معرفی شد. این عملگر چک میکنه که آیا دو شیء متعلق به بک کلاس هستند یا خیر.

برای درک بیشتر مثال زیر رو ببینید :

class Database

{

// code . . .

}

$db = new Database();

if($db instanceOf  Database)

echo 'true';

else

echo 'false';

در مثال بالا به خاطر اینکه شیء $db یک نمونه از کلاس Database میباشد مقدار True در خروجی چاپ میشود.

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

class Users extends Database

{

//code...

}

$user = new Users();

if($user instanceOf  Database)

echo 'true';

else

echo 'false';

امیدوارم از این آموزش بهره کافی رو ببرید. نظرات سوالات و پیشنهادات و انتقادات و … رو در بخش کامتها اعلام کنید . .  .

موفق باشید

بازدید : ۷۲۳۱

محمد
اردیبهشت ۲۷, ۱۳۹۱ @ ۴:۱۰ ب.ظ

سلام. باتشکر از آموزشهای مفیدتون
لطفا در صورت امکان پس از هر مرحله از آموزش یا پس از اتمام تمام مباحث شی گرایی در php یک پروژه عملی شی گرایی که تمامی مباحث را پوشش دهد ارائه دهید تا افراد کم تجربه ای همچون من یاد بگیریم.
باتشکر

پاسخ دادن
    سعید
    اردیبهشت ۲۸, ۱۳۹۱ @ ۱۲:۲۲ ق.ظ

    خواهش میکنم
    چشم حتما این کارو انجام میدم

    موفق باشید

    پاسخ دادن
اردیبهشت ۲۷, ۱۳۹۱ @ ۴:۴۴ ب.ظ

در مورد instanceof تحقیق نکرده بودم. مرسی که توضیحشو دادی.

پاسخ دادن
محمد
اردیبهشت ۲۸, ۱۳۹۱ @ ۱۲:۳۶ ق.ظ

البته آموزشهاتون گویاست و کاربردی…
بخاطر دید سیستمی تر گفتم! همه اجزا در کنار هم

پاسخ دادن
پویان
شهریور ۱, ۱۳۹۱ @ ۴:۱۳ ب.ظ

سلام عالی عالی عالیه سایتت فقط اگه میشه هر پست و pdf کن ی صفحه ب سایتت اضافه کن مثلا لیست مقالات سایت همه مطالبو اونجا بزا بصورت pdf خیلی خوب میشه سایتت . بازم ممنون از این مطالب مفید

پاسخ دادن
بهمن ۹, ۱۳۹۲ @ ۷:۲۶ ب.ظ

دمت گرم
این بحث ارث بری بدجوری به دردم خورد . من دوتا کلاس نوشتم که تقریبا ۸۰% شبیه هم بودن و داشتم فکر می کردم چجوری از این تکرار جلوگیری کنم که این ارث بری به کمکم اومد
ممنون

پاسخ دادن
farzin
مهر ۲۴, ۱۳۹۳ @ ۴:۴۱ ب.ظ

آموزش عالی بود ممنون

پاسخ دادن
آذر ۱۸, ۱۳۹۳ @ ۴:۳۱ ب.ظ

سلام – مرسی بخاطر مطلب خوبتون.

من تو کدهای PHP دیدم بعضی جاها از :: (دو بار دو نقطه) استفاده میشه. این برای چیه؟

پاسخ دادن
    Saeed Moqadam
    آذر ۲۴, ۱۳۹۳ @ ۹:۰۹ ب.ظ

    از :: برای دسترسی به متدها و متفرهای استاتیک استفاده میشه.

    پاسخ دادن
آذر ۲۵, ۱۳۹۳ @ ۴:۵۳ ب.ظ

پاسخ دهید

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


*