آموزش شی گرایی در PHP - قسمت دوم
ارث بری
یکی از مواردی که در شی گرایی اهمیت فراوانی دارد، بحث ارث بری می باشد. با یک مثال مفهوم ارث بری را بررسی می کنیم. همانطور که فرزند، ویژگی هایی را از پدر خود به ارث می برد مانند رنگ پوست، رنگ چشم و ... در علم برنامه نویسی هم همینطور است. کلاس ها می توانند رابطه پدر و فرزندی داشته باشند و ویژگی هایی را از کلاس پدر خود به ارث ببرند. در قسمت قبل با ساختار و رفتارهای یک کلاس آشنا شدیم. کلاس ها می توانند ساختار ها و رفتار خود را از کلاس والد خود (Parent) به ارث ببرند.
مزایای ارث بری
یکی از مهم ترین مزایای ارث بری، قابلیت استفاده مجدد از کد و جلوگیری از تکرار کد می باشد. فرض کنید برای کار با پایگاه داده شما در تمام کلاس هایتان دستورات اتصال به پایگاه داده و پیکربندی آن را به انجام می دهید. در واقع شما یک کد ثابت را چندین بار در کلاس های مختلف استفاده می کنید. در حالی که می توانید با استفاده از ارث بری در شی گرایی، کد ثابت را به یک متد تبدیل کرده و رابطه ارث بری بین کلاس های مربوطه ایجاد کنید. با این کار حجم کدهای شما کاهش میابد، سرعت برنامه نویسی شما افزایش میابد، اگر قصد به روز رسانی کدهایتان را داشته باشید، به راحتی و با یک بار تغییر، تغییرات در کل پروژه ما اعمال خواهد شد. در صورتی که از ارث بری استفاده نکنید، برای هر تغییر نیاز به ویرایش چندین کلاس دارید.
سطوح دسترسی در ارث بری
کلاس ها به ۳ روش مختلف می توانند از یکدیگر ارث بری کنند.
- ارث بری از نوع Private: متدها و پراپرتی های یک کلاس که از نوع private تعریف شده باشند، به ارث برده نخواهند شد و فقط در همان کلاس قابل دسترسی هستند. به عنوان مثال، اگر کلاس a متدی به نام test داشته باشد که به صورت private تعریف شده باشد و کلاس b از کلاس a ارث بری کند، کلاس b به متد test دسترسی نخواهد داشت.
- ارث بری از نوع Public: متدها و پراپرتی های یک کلاس که از نوع public تعریف شده باشند، به ارث برده خواهند شد. علاوه بر آن در همان کلاس نیز قابل استفاده هستند. به عنوان مثال، اگر کلاس a متدی به نام test داشته باشد که به صورت public تعریف شده باشد و کلاس b از کلاس a ارث بری کند، کلاس b به متد test دسترسی خواهد داشت.
- ارث بری از نوع Protected: این متد عملکردی مشابه public دارد. تنها تفاوت آن ها در دسترسی نمونه های یک کلاس به متدها می باشد.
نمونه (شیء) از یک کلاس به چه معناست؟
یک شیرینی پزی را در نظر بگیرید که قصد دارد ۱۰۰ عدد شیرینی به شکل گل رز بسازد. شیرینی پز در ابتدا یک قالب درست می کند و ۱۰۰ عدد شیرینی را با آن قالب می سازد. در این مثال، قالب همان کلاس است و ۱۰۰ عدد شیرینی همان نمونه های یک کلاس هستند. حال به راحتی می توان تفاوت سطح دسترسی public و protected را درک کرد. نمونه ای از یک کلاس، دسترسی به متد های protected آن کلاس را ندارد و تنها کلاسی که فرزند کلاسی دیگر باشد به متد ها و پراپرتی های آن کلاس دسترسی دارد. به عنوان مثال کلاس a متدی به نام test و از نوع protected دارد. اگر کلاس b از کلاس a ارث بری کند، کلاس b به متد test دسترسی دارد. دقیقا مانند public. تنها تفاوت آنها اینجاست که نمونه ای که از کلاس a ساخته می شود قادر به دسترسی به متد test نخواهد بود. اگر می خواهید متدی داشته باشید که نمونه های آن کلاس قادر به دسترسی به آن باشند، حتما باید از نوع public تعریف شوند.
نحوه دسترسی به متد ها و ساختار های کلاس والد
در کلاس های فرزند یا به اصلاح مشتق شده از کلاس والد، می توان توسط اشاره گر $this به متد ها و کلاس های کلاس والد دسترسی داشت. لازم به ذکر است اشاره گر $this به کلاس جاری اشاره می کند و به تمامی متد ها و ساختار های کلاس خود نیز دسترسی دارد.
نحوه ایجاد ارث بری در php
ایجاد رابطه ارث بری توسط کلمه کلیدی extends انجام می شود.
همانطور که در کد فوق مشاهده می کنید، متد test کلاس b توسط اشاره گر $this به پراپرتی a2 کلاس a دسترسی دارد و می تواند مقدار a2 را چاپ کند. اما همانطور که در تصویر زیر می بینید، متد test به پراپرتی a1 دسترسی ندارد.

و همینطور یک نمونه کلاس به پراپرتی و متد protected دسترسی ندارند

متد ها و property های ثابت ( static )
متد ها و پراپرتی ها را می توان به صورت استاتیک و ثابت هم تعریف کرد. در این صورت نحوه دسترسی به آن تفاوت دارد. متدهای معمولی با اشاره گر $this قابل دسترسی بودند و کلاس های استاتیک با اشاره گر self:: قابل دسترسی هستند. مزیت استفاده از متدها و پراپرتی های استاتیک صرفه جویی در مصرف حافظه می باشد و نمی توان نمونه ای از آنها ساخت. توجه داشته باشید که دسترسی به متدها و پراپرتی های استاتیک مانند متدهای معمولی نیست و به شکل ClassName::MethodNameOrPropertyName قابل دسترسی هستند. نحوه تعریف آنها به صورت public static function functionName(){} می باشد.
متد سازنده Constructor
متدهایی در تمامی کلاس ها قابل تعریف می باشند که نام های مشخصی دارند و هر کدام در مواقعی کاربرد دارند که اصطلاحا به آن ها متد جادویی گفته می شود. پر کاربردترین متد جادویی construct می باشد. این متد ،زمانی که یک شی (نمونه) از یک کلاس ساخته شود، به صورت خودکار اجرا می شود. فرض کنید کلاسی داریم که متدی با نام file_upload دارد. می خواهیم کاری کنیم که اگر کاربر فایل با حجم بالای ۵ مگابایت را انتخاب کرد، به او پیغام خطا نشان دهیم. در این صورت از متد construct استفاده می کنیم.نحوه استفاده از آن به صورت زیر است:

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