دسته بندی :
تاریخ انتشار : ۰۶ مهر ۱۳۹۴
گردآوری و تالیف : حسام موسوی

کارمو با طراحی گرافیکی شروع کردم و حدود 2 سال طراحی گرافیکی میکردم بعد به طراحی وب علاقه پیدا کردم و همراه طراحی وب عاشق کدنویسی شدم به PHP | sass | css | Jquery | javaScript تسلط کامل دارم . در بین فریم ورک های PHP اول با CodeIgniter کار کردم اما به laravel علاقه مند شدم و دارم بطور حرفه ای دنبالش میکنم . امید من اینکه بتونم کاربرهای ایرانی رو به دنیای بیرون متصل کنم تا بتونن از فناوری های تازه آگاهی داشته باشن

با سلام خدمت دوستان و کاربران عزیز وبسایت راکت در قسمت های قبل یعنی

در مورد مفهوم برنامه نویسی شی گرا در php و همینطور در مورد property ها و method ها و Encapsulation (کپسوله سازی) صحبت کردیم و با مثال های مختلف اونا رو بهتون یاد دادیم در این جلسه قصد داریم در مورد Inheritance (وراثت) صحبت کنیم  و اونو بهتون آموزش بدم امیدوارم مورد استفاده اتون قرار بگیره . 

Inheritance (وراثت)

امروز میخوام در مورد یک بحث مهم در شی گرائی صحبت کنم و اونم وارثته . خوب اینجا من گفتم وارثت ، اولین چیزی که بعد از شنیدن وراثت به ذهنتون خطور کرد چی بود ؟ بزارین با اون چیزی که به ذهن من خطور کرد این مبحث رو شروع کنیم . اولین چیزی که بعد از شنیدن این کلمه به ذهن من خطور کرد ویژگی هایه که از والدینم به ارث بردم یا مثلا خیلی وقتا خیلی مرضی ها ارثین مثل کچلی که از والدین یا والدینشون به ارث میبرین ( :D )  . اگه این موضوع رو در دنیایی واقعی برای خودتون بازتر کنید و سعی کنید اونو به شی گرایی مرتبط کنید به راحتی میفهمید که چقدر اینا شبیه هم هستن .

در نظر بگیرید شما باید یک متدی با یک وظیفه ای خاصی بنویسید اما دقیقا این متد در پدر یا پدر پدر کلاس فعلیتون وجود داره خوب بنظرتون باید دوباره اون method رو بنویسید یا از اون متدی که در کلاس های پدر هست استفاده کنید . اول اینکه دوباره نویسی کدهاتون فوق العاده کم میشه و بعدش اینکه مدیریت روی کدهاتون به راحتی بالا میره . کیه که این روش کد نویسی رو نخواد . چون واقعا کار رو راحتتر میکنه .

در این جا روش ارث بری یک کلاس از کلاس دیگه رو مطرح میکنم و یه سری ویژگی ها که تو بحث وراثت در شی گرایی ، شما میتونید ازش استفاده کنید رو بهتون یاد میدم . 

بزارید یک مثال ساده بزنم . در پایین من یک کلاس معمولی به اسم Father میسازم و یک method توش قرار میدم .  

class father
{
    public function getEyeCount() {
        return 2 ;
    }
}

خب حالا که کلاس پدر رو ساختیم میخوام یک کلاس دیگه مثل زیر بسازم به اسم child و به father متصل کنم.

<?php

class child extends father
{
    
}

$obj = new child;
echo $obj--->getEyeCount; // 2

?>

در بالا ما با کمک کلمه کلیدی extends تونستیم کلاس child رو به کلاس father مرتبط کنیم و با استفاده از متدی که در کلاس father هست مقداری رو در کلاس فرزند برگردونیم . 

نکته : به یاد داشته باشید property ها و method های که از نوع private باشن قابلیت ارث بری ندارن و نمیشه در کلاس های فرزند از این نوع method ها و property ها استفاده کرد . 

در اینجا چند مسئله پیش میاد که شاید برای شما هم سوال شده باشه ! مسئله اول اینکه یک کلاس که از کلاس پدر ارث می بره خودش (فرزند) میتونه ویزگی های ( method ها و peroperty های ) خودش رو داشته باشه ؟ مسئله دوم اینکه آیا میشه method ها و property های که در کلاس پدر هست در کلاس فرزند هم دوباره نویسی کرد با یک ویژگی خاص دیگه ؟ بزارید اینجا به این دو مسئله جواب بدیم تا دیگه سوالی در موردش نباشه . 

یک کلاس که از کلاس پدر ارث می بره خودش (فرزند) میتونه ویزگی های خودش رو داشته باشه ؟

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

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

class MyClass
{
  public $prop1 = "I'm a class property!";
 
  public function setProperty($newval)
  {
      $this->prop1 = $newval;
  }
 
  public function getProperty()
  {
      return $this->prop1;
  }
}
 
class MyOtherClass extends MyClass
{
  public function newMethod()
  {
      echo "From a new method in" . __CLASS__ ;
  }
}
 
// Create a new object
$newobj = new MyOtherClass;
 
// Output the object as a string
echo $newobj->newMethod();
 
// Use a method from the parent class
echo $newobj->getProperty();
 
?>

 نتیجه کد بالا بصورت زیر به نمایش در میاد اما شاید براتون سوال شده باشه که __CLASS__ دقیقا چیه این اسم کلاس رو برامون بر میگردونه . 

From a new method in MyOtherClass.
I'm a class property!

 آیا میشه method ها و property های که در کلاس پدر هست در کلاس فرزند هم دوباره نویسی کرد با یک ویژگی دیگه ؟ 

جواب این مسئله هم بله است ، شما به راحتی مثل کد زیر می تونید همون متدی که در کلاس پدر هست با همون اسم در کلاس فرزند بسازین و دوباره نویسی کنید با ویژگی های جدید اینطوری اول چک میکنه که اون method در کلاس فزرند هست یا خیر اگر بود که برگشت داده میشه و اگر نبود به کلاس پدر میره و دنبال اون method میگرده و اگر بود برمیگردونه.

<?php

class Foo
{
    public function printItem($string)
    {
        echo 'Foo: ' . $string . PHP_EOL;
    }
    
    public function printPHP()
    {
        echo 'PHP is great.' . PHP_EOL;
    }
}

class Bar extends Foo
{
    public function printItem($string)
    {
        echo 'Bar: ' . $string . PHP_EOL;
    }
}

$foo = new Foo();
$bar = new Bar();
$foo->printItem('baz'); // Output: 'Foo: baz'
$foo->printPHP();       // Output: 'PHP is great' 
$bar->printItem('baz'); // Output: 'Bar: baz'
$bar->printPHP();       // Output: 'PHP is great'

?>

خوب امیدوارم این قسمت هم مورد استفاده اتون قرار گرفته باشه و تونسته باشم بهتون چیزی یاد داده باشم . در قسمت بعدی در مورد متدهای جادوی صحبت میکنم و اونا رو بهتون یاد میدم . 

دیدگاه های مخاطبین

ثبت دیدگاه شما
  • حسین صادقی

    سلام پس لطفا اصلاحش کنید که تازه کارهایی مثل من گیج نشن
    ممنون از زحماتتون

    • admin

      بله حق با شماست و اصلاح شد دوست عزیز

  • حسین صادقی

    سلام
    ممنون از توضیحاتتون
    در این خط
    printItem('baz'); // Output: 'Foo: baz'
    فکر کنم اشتباه هست. چون ننوشتید که متد پرینت آیتم رو از کدوم شی بخونه.
    اگر اشتباه نیست، چطور رفته از پدر خونده در صورتی که در فرزند هم موجوده

    • admin

      بله اشتباهه باید از شی Foo بخونه و نمایش بده

  • امین شاکر

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

    • admin

      بله حق با شما بود مشکل این پست حل شد

    • امین شاکر

      منظورم این نیست که کدهای php اشتباهن. منظور به طور ناقص درج شدن شما به سطر بعد این نوشته دقت کنید:
      "بزارید یک مثال ساده بزنم . در پایین من یک کلاس معمولی به اسم Father میسازم و یک method توش قرار میدم . "

      با تشکر.

    • admin

      مرسی حتما چک میشه ولی فک کنم تا اونجای که میدونم درستن

  • jahan

    خیلی ممنونم
    برای من که خیلی مفید بود.

  • bahar

    سلام ممنون خیلی شیوا توضیح دادید.
    سایت شما برای فراگیری مطلب oop سایت خوبیه. امیدوارم هم ادامه داشته باشه و هم سریعتر ادامه مطالب رو بزاید چون خیلیا منتظر مبحث بعدیش هستند.فقط ی سوال PHP_EOL; چیه که آخر دستوراتتون نوشتید؟

    • admin

      چشم حتما ادامه میدیم
      PHP_EOL هم هر کجا استفاده بشه خط فعلی رو به اول خط بعدی منتقل میکنه مثل "n\"

  • محمدامین

    سلام.
    خیلی عالی بود،سپاسگزارم

پیشنهاد میکنیم این مطالب رو هم مطالعه کنید :