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

در مورد مفهوم برنامه نویسی شی گرا در 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'

?>

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

چه امتیازی به این مقاله می دید؟
خیلی بد
بد
متوسط
خوب
عالی

دیدگاه‌ها و پرسش‌ها

برای ارسال دیدگاه لازم است، ابتدا وارد سایت شوید.

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

آفلاین
user-avatar
حسام موسوی @hesammousavi
اول داستان، طراح گرافیک بودم و ۲ سالی به عنوان طراح مشغول بودم، بعد به برنامه‌نویسی علاقمند شدم و الان بیشتر از ۱۰ ساله که عاشق کدزنی و چالش‌های پروژه...
دنبال کردن

گفتگو‌ برنامه نویسان

بخشی برای حل مشکلات برنامه‌نویسی و مباحث پیرامون آن وارد شو