در پست قبل شی گرایی را شروع کردیم. گفته شد که که در شی گرایی هر موجودیت در برنامه را یک شی در نظر می گیریم. مثل دنیای واقعی که هر موجود زنده یا غیر زنده ای را می توان یک شی در نظر گرفت.

مفهموم ارث بری (inheritance)

هممانطور که در دنیای واقعی مفهومی به نام ارث داریم در برنامه نویسی هم چیزی داریم به نام ارث بری .

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

ارث بری کجا استفاده می شود

خوب، قبل از اینکه نحوه ایجاد ارث بری در php را ببینیم باید متوجه شویم که این قضیه کجا در برنامه نویسی به دردمان می خورد.

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

<?php
Class Product{

Public $product_name = "car";
Public $product_price = "2000 tomans";
Public $product_description = "best car";

public function __construct()
{
    echo $this ->product_name;
}

Public function setPrice($price){
    $this->product_price = $price;

}
}

در این مثال سه خصوصیت برای یک محصول در نظر گرفته شده:

  • اسم(name)
  • قیمت (price)
  • توضیح (description)

اینجا من یک محصولی به عنوان خودرو ثبت کردم. که می تواند خصوصیات دیگری مثل ابعاد، رنگ، مدل و … هم داشته باشد.

حالا فرض کنید در کنار این محصول قرار باشد  محصولات دیگری هم داشته باشم که خصوصیات متفاوتی از محصول قبلی داشته باشند.

اگر می خواستم ویژگی های دیگری به این محصول اضافه کنم مثل تعداد صفحات، ناشر، سال چاپ، ناشر بک راه این است که همین ها را به پراپرتی های بالا اضافه کنیم.

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

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

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

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

این شکلی متدها و پراپرتی هایی که فکر می کنیم در همه محصولات مشترک هستند را در کلاس پدر و متدها و پراپرتی های مخصوص هر محصول را در کلاس خودش می نویسیم.

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

با کلید واژه extends می شود یک کلاس را به عنوان کلاس فرزند (child) تعریف کرد.

Class Book extends Product{

    public $num_page;
    public $writer;
    public $publisher;

    public function setWriter($name){
        $this->writer = $name;
    }

    public function setNumPage($num){
        $this->num_page = $num;
    }

    public function setPublisher($name){
        $this->publisher = $name;
    }

    public function print_writer_name(){

        echo $this->writer;

    }


}

در این مثال کلاس Book فرزند Product است.

پراپرتی ها و متدهای  مخصوص به خودش هم تعریف شده است.

کلاس Book تمام متدها و پراپرتی های کلاس Product را به ارث برده است و دیگر نیازی نیست دوباره در این کلاس تعریف شوند.

هر تعداد کلاس دیگری که بخواهیم می شود به عنوان کلاس فرزند برای Product تعریف کرد.

ارث بری یکی از مهم ترین ویژگی ها و کابردهای شی گرایی است که تکرار کد را کمتر می کند و برنامه نویسی را منظم تر و راحت تر خواهد کرد. تقریبا در هر اپلیکیشن یا وبسایتی که با شی گرایی کار کنید از inheritance استفاده خواهید کرد.