در این جلسه از آموزش php با پردیس وردپرس به بخش پایانی شئ گرایی در php می پردازیم.
مرحلهی هجدهم:
ارث بری یا استفاده مجدد از کدهای نوشته شده با ساختار OOP
ارثبری یکی از قابلیتهای اساسی در برنامهنویسی شیءگرا محسوب میشود و با استفاده از آن میتوان از یک کلاس به عنوان ساختار پایه برای کلاسهای دیگر بهره برد. این عمل به شما اجازه میدهد تا به صورت بهینهتری از کدهای نوشته شدهی قبلی خود و نیز کدهای نوشته شده توسط دیگران، استفاده کنید.
فرض کنید که قصد ایجاد یک کلاس جدید به نام employee (کارمند) را دارید. از آنجا که هر کارمند یک شخص است، بنابراین این دو میتوانند پروپرتیها و متدهای مشترکی داشته باشند.
با استفاده از ویژگیهای ارثبری میتوانید کد کمتر و بهینهتری را تولید کنید چراکه فقط موارد اضافه را باید به کلاس جدید اضافه کنید و در واقع میتوان از ویژگیهای یک کلاس دیگر به منظور ساخت کلاس جدید بهره گرفت. دو عامل زیر از جمله دلایلی تلقی میشوند که باعث شده استفاده از ارثبری در کلاسهای پیاچپی منطقی به نظر برسد:
- شما فقط یک بار باید کد مورد نظرتان را بنویسید.
- کد اولیه و اصلی مجددا استفاده خواهد شد و میتوان از آن در هر تعداد کلاس دیگر، استفاده کرد.
از نظر مفهومی ارثبری شبیه به عملیات Include کردن است که در جلسات قبل به صورت مفصل آن را توضیح داده بودیم. به کد زیر توجه کنید:
// 'extends' is the keyword that enables inheritance class employee extends person { function __construct($employee_name) { $this->set_name($employee_name); } }
مرحلهی نوزدهم:
از آنجا که کلاس employee بر پایهی کلاس person ایجاد شده است، بنابراین کلاس employee به طور خودکار تمامی متدهای عمومی و محافظتشده و نیز تمامی پروپرتیهای عمومی و محافظتشدهی کلاس person را دارا خواهد بود. به عبارت دیگر میتوان گفت که کلاس employee در واقع نوعی دیگر از کلاس person است. به کد نمونهی فوق توجه کنید تا مطلب بیان شده را بهتر درک کنید.
اما چگونه بدون اینکه متد ()set_name در کلاس employee تعریف شده باشد ما قادر به استفاده از آن خواهیم بود؟
ما قبلا متد ()set_name را در کلاس person تعریف کرده بودیم و با توجه به ویژگی ارثبری در پیاچپی، کلاس جدید میتواند از متدهای عمومی و محافظتشدهی کلاس پایه استفاده کند.
کلاس person در اینجا کلاس پایه یا کلاس والد خوانده میشود زیرا کلاس جدیدی که به نام employee ساختیم، به عنوان ساختار پایه از کلاس person بهره گرفته است. سسله مراتب همیشه در پروژههای مختلف پیاچپی یک موضوع مهم است که باید به آن توجه ویژه داشته باشید. این امر به ویژه وقتی که پروژهی شما پیچیدهتر میشود بسیار کارا خواهد بود.
مرحلهی بیستم:
همانطور که در کد زیر نیز مشاهده میکنید، میتوانیم متد get_name را در کلاس employee فراخوانی کنیم. کد زیر یک مثال بسیار خوب برای فهم بیشتر این مبحث است:
<?phpinclude("class_lib.php"); ?> <?php // Using our PHP objects in our PHP pages. $mohammad = new person("mohammad safari"); echo "mohammad's full name: " . $mohammad->get_name(); $ali = new employee("ali safari"); echo "---> " . $ali->get_name(); ?>
در مثال بالا روش استفادهی مجدد از کدهای نوشته شده با ساختار OOP را مشاهده میکنید. یعنی شما دیگر نیازی به نوشتن مجدد برخی از متدها نخواهید داشت و میتوانید از متدهای کلاس پایه یا والد، بهره ببرید. این روش باعث میشود تا کد نوشته شدهی شما به اصطلاح ماژولار شده و قابلیت توسعه و پیشرفت دادن آن بیشتر شود. همچنین ساختار کدها منسجمتر شده و نیاز به نوشتن کد کمتری خواهید داشت.
مرحلهی بیستویک:
اووِر راید کردن متدها
برخی مواقع هنگام استفاده از ویژگی ارثبری، ممکن است نیاز به تغییر برخی از توابع کلاس پایه داشته باشید. به عنوان مثال، اجازه دهید متد ()set_name در کلاس employee را تغییر دهیم به نحوی که این متد در این کلاس نسبت کلاس person تغییر یابد. در این شرایط شما با تعریف کردن متدی مشابه در کلاس employee، در واقع نسخههایی از متد ()set_name را از کلاس person، اووِر راید کردهاید. به کد زیر توجه کنید:
<?php class person { protected function set_name($new_name) { if ($new_name != "Mohammad Two") { $this->name = strtoupper($new_name); } } } class employee extends person { protected function set_name($new_name) { if ($new_name == "mohammad safari") { $this->name = $new_name; } } } ?>
توجه داشته باشید که متد ()set_name اکنون و پس از تغییرات بالا در کلاس جدید employee با همین متد در کلاس پایه با همان person تفاوت دارد.
مرحلهی بیستودوم:
گاهی ممکن است نیاز داشته باشید تا به نسخهی اصلی متدی در کلاس پایه دسترسی داشته باشید که آن را در کلاس جدید اوور راید کردهاید. در مثال ما، متد ()set_name در کلاس employee اوور راید شده است. حالا قصد داریم از کد زیر استفاده کنیم:
person::set_name($new_name);
به منظور دسترسی به نسخهی اصلی متد ()set_name که در کلاس والد (person) وجود دارد، باید از کدی شبیه به زیر استفاده کنیم:
<?php class person { // explicitly adding class properties are optional - but // is good practice var $name; function __construct($persons_name) { $this->name = $persons_name; } public function get_name() { return $this->name; } // protected methods and properties restrict access to // those elements. protected function set_name($new_name) { if ($this->name != "Mohammad Two") { $this->name = strtoupper($new_name); } } } // 'extends' is the keyword that enables inheritance class employee extends person { protected function set_name($new_name) { if ($new_name == "Stefan Sucks") { $this->name = $new_name; } else if ($new_name == "Johnny Fingers") { person::set_name($new_name); } } function __construct($employee_name) { $this->set_name($employee_name); } } ?>
استفاده از سیمبلها (symbol)
استفاده از :: برای تشخیص نام کلاسی که قصد داریم از متدهای داخلی آن استفاده کنیم به کار میرود. به مثال زیر توجه کنید تا این مبحث را بیشتر توضیح دهیم:
'person::set_name()'
کد بالا به پیاچپی میگوید که به دنبال متد ()set_name در کلاس person بگردد. علاوه بر این یک راه میانبر دیگر برای اشاره به کلاس والد کلاس کنونی وجود دارد. این راه میانبر در واقع استفاده از کلمهی کلیدی parent است. به کد نمونهی زیر توجه کنید:
protected function set_name($new_name) { if ($new_name == "mohammad safari") { $this->name = $new_name; } else if ($new_name == "ali safari") { parent::set_name($new_name); } }