آموزش شی گرایی در PHP – ارث بری

آموزش شی گرایی در PHP

یکی از مزیت های اصلی برنامه نویسی شی گرا، کاهش تکرار در کدها با قابلیت ارث بری (inheritance) است.

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

در ارث بری، یک کلاس مادر (parent) با متدها و خواص خود را داریم و یک کلاس یا کلاس های فرزند (child) داریم که می توانند از کدهای مادر استفاده کنند.

با استفاده از ارث بری، می توانیم تکه کدهایی بنویسیم که فقط یکبار در کلاس مادر بنویسم و بارها آنرا بنابر نیاز داخل کلاس های فرزند استفاده کنیم.

 

چطور یک کلاس، کدهای کلاس دیگر را ارث می برد؟

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

 

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

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

 

در مثال پایین، کلاس SportsCar از کلاس Car ارث بری می کند، بنابراین به تمام متدها و خواص غیر پرایوت کلاس Car دسترسی دارد.

این کار به به ما اجازه نوشتن یکباره متدها پابلیک setModel() و hello() داخل کلاس مادر را می دهد و بعد می توانیم در هر دو کلاس مادر و فرزند استفاده کنیم.

 

خروجی :

 

چطور یک کلاس فرزند می تواند متدها و خواص خود را داشته باشد؟

همانطور که کلاس فرزند می تواند متدها و خواص مختص به خود را داشته باشد، کلاس مادر هم می تواند.

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

 

در مثال زیر، خاصیت $style و متد driveItWithStyle() را به کلاس فرزند اضافه کردیم:

 

خروجی:

 

سطح دسترسی protected

زمانی که یک متد یا خاصیت را به عنوان protected تعریف می کنیم، می توانیم از هر دو کلاس مادر و فرزند به آن دسترسی داشته باشیم.

در آموزش قبلی، یاد گرفتیم که متد یا خاصیت با سطح دسترسی public می تواند داخل یا خارج از کلاس قابل دسترس باشد. همچنین متد یا خاصیت های private فقط داخل خود کلاس قابل دسترس هستند.

 

در این بخش از آموزش شی گرایی، با سطح دسترسی سوم protected آشنا می شویم که امکان استفاده کدها داخل کلاس فرزند را می دهد.

اولین مثال ما یک خاصیت $model را بصورت private در کلاس مادر تعریف و سعی می کنیم در کلاس فرزند به آن دسترسی داشته باشیم.

 

خروجی:
Notice: Undefined property: SportsCar::$model
ما یک خطا دریافت کردیم چرا که متد hello() در کلاس فرزند قصد دارد به خاصیت پرایوت $model که متعلق به کلاس مادر است دسترسی پیدا کند.

 

می توانیم این شکل را با تعریف کردن $model بصورت protected حل کنیم (به جای private)

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

 

خروجی :
beep! I am a Mercedes Benz
حالا کار کرد، چرا که با سطح دسترسی protected می توانیم از کلاس فرزند به کدهای کلاس مادر دسترسی داشته باشیم.

 

چطور خواص و متدهای کلاس مادر را در کلاس فرزند override کنیم؟

همانطور که کلاس فرزند می تواند متد و خواص خود را داشته باشد، می تواند متد و خواص کلاس فرزند را بازنویسی (override) کند.

زمانی که متد و خواص کلاس را override می کنیم، باید همان را داخل کلاس فرزند دوباره بنویسیم ولی اینبار با مقادیر یا کدهای متفاوت.

 

در مثال پایین، ما یک متد hello() در کلاس مادر ساهتیم که مقدار “beep” را برگشت می دهد و این متد را در کلاس فرزند بازنویسی می کنیم تا مقدار Hallo را برگشت دهد.

 

خروجی :

Hallo

 

چطور از override شدن متدهای کلاس فرزند جلوگیری کنیم؟

برای جلوگیری از بازنویسی متدهای کلاس مادر، می توانیم کلیدواژه final را به متدهای مادر بدیم.

 

در مثال پایین، متد hello() را در کلاس مادر به عنوان final تعریف کردیم، اما با این حال در این مثال سعی می کنیم که در کلاس فرزند آن را بازنویسی کنیم:

 

خروجی :

Fatal error: Cannot override final method Car::hello()

از آنجا که متد hello را بصورت final در کلاس مادر تعریف کردیم، پس نمی توان آن را در کلاس فرزند بازنویسی (override) کرد.

 

جمع بندی

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

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

در آموزش بعدی، با کلاس و متدهای abstract آشنا می شویم، که این کلاس ها قابلیت ساختن شی از آن را ندارند و متدهای آن می تواند بدون بدنه کد باشند.

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

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

  1. رضا ۷ اردیبهشت ۱۴۰۱

    سلام من یک سایت ساده دارم که با پی اچ پی وصل شده به دیتابیس و بعد اطلاعات یک جدول و میگیره و در سایتم به کاربر نشون میده حالا این اطلاعاتی که توی دیتابیس من هست دایم درحال تغییره من می‌خوام بدونه اینکه احتیاج باشه کاربر صفحه رو رفرش کنه اطلاعات چاپ شده براش بروزرسانی بشه میشه کدشو کامل بهم بدی یعنی خودت مجدد کد های اتصال به دیتابیس و چاپ اون متغیر و استفاده از آجاکس و بهم بدی؟

    پاسخ
    1. حسن شفیعی ۷ اردیبهشت ۱۴۰۱

      سلام. اصلا مشخص نیست که سایتتون چطوریه کدنویسیش به چه صورته برای همین باید با هزینه واگذاری کنید تا کدش براتون نوشته بشه

      پاسخ
دوره های آموزشی