در این بخش با مفهوم ارث بری که یکی از جنبه های مهم برنامه نویسی شی گرا هست آشنا می شوید. با کمک ارث بری خواص و متدهای کلاس پدر به کلاس های فرزندان داده می شوند. با کمک ارث بری از نوشتن کدهای مشترک بین بخش های مختلف برنامه خلاص می شویم.
می توان گفت چارچوب MVC بیشترین مزیت ها و ویژگی هایش برای جلوگیری از نوشتن کدهای تکراری را از خاصیت ارث بری کلاس ها بدست آورده است.قبل از مطالعه این بخش توصیه می شود بخش سوم که شروع آموزش برنامه نویسی شی گرا با PHP هست را مطالعه کنید.
وراثت کلاس ها در برنامه نویسی شی گرا
ارث بری همان تقریباً همان مفهومی است که در دنیای واقعی با آن آشنا هستیم. مثلاً فرزند خصوصیات و رفتار پدرش را به ارث می برد. در برنامه نویسی هم کلاس ها میتوانند متد ها و خواصشان را از کلاس های دیگر به ارث برند و برای این کار از extends استفاده میکنیم .
برای اینکه یک کلاس ، خواص و متد های کلاس دیگری را داشته باشد باید فرزند آن باشد یعنی به آن کلاس extends شود .
برای مثال به کد زیر توجه کنید:
<?php
class Model {
public $db = "";
public function setDB($dbanme){
$this->db = $dbname;
}
}
class studModel extends Model {
public $table= "studs";
function setTable($tname) {
$this->table = $tname;
}
}
$st = new studModel();
$st->setDB("amoozesh");
$st->setTable("studs");
?>
همانطور که در کد فوق دیده می شود، کلاس studModel بصورت فرزند کلاس Model تعریف شده و از آن ارث بری دارد یعنی خواص و متدهای آنرا (خاصیت $db و متد setDB) به ارث می برد. ضمن اینکه خواص و متدهای خاص خودش(خاصیت $table و متد setTable) را هم دارد.
پس چنانچه شیی از نوع کلاس studModel تعریف شود هم دارای یک نسخه از خصوصیات و متدهای کلاس studModel و هم یک یک نسخه از خصوصیات و متدهای کلاس پدرش(Model) خواهد بود.
باز نویسی متد ها و خواص به ارث رسیده در شی گرایی
برای بازنویسی تنها کافی است خاصیت یا متد نوشته شده را دوباره در کلاس فرزند تعریف کنید. به عنوان مثال در کد فوق کلاس studModel می تواند خودش نیز دارای یک متد setDB باشد که در این صورت اگر این متد با شی از نوع studModel تعریف شود، متد مخصوص خودش را اجرا خواهد کرد.
<?php
class Model {
public $db = "";
public function setDB($dbanme){
$this->db = $dbname;
}
}class studModel extends Model {
public $table= "studs";
function setTable($tname) {
$this->table = $tname;
}
public function setDB($dbanme){
$this->db = $dbname;
}
}$st = new studModel();
$st->setDB("amoozesh");
$st->setTable("studs");
?>
اجرای متد های به ارث رسیده در صورت بازنویسی آنها
امکان دارد در کلاس فرزند شما، یک متد که در کلاس مادر هست دوباره تعریف شود اما بخواهید متد کلاس مادر نیز دوباره اجرا شود . برای این کار ما از parent به همراه کلمه کلیدی :: استفاده میکنیم .
شما میتوانید به متد های کلاس مادر به شکلparent::methodName()دسترسی داشته باشید. در مثال فوق اگر متد setDB دوبار نوشته شده باشد یک بار در کلاس پدر (Model) و یک بار در کلاس فرزند (studModel)، آنرا روش می توانیم فراخوانی کنیم:
<?php
class Model {
public $db = "";
public function setDB($dbanme){
$this->db = $dbname;
}
}class studModel extends Model {
public $table= "studs";
function setTable($tname) {
$this->table = $tname;
}
public function setDB($dbanme){
parent::setDB( $dbname); // فراخوانی متد پدر}
}
$st = new studModel();
$st->setDB("amoozesh");
$st->setTable("studs");
?>
تعیین عمومی بودن کلاس ها و خاصیت ها
برای اینکه بر روی اشیا ، متد ها و خواص کنترل داشته باشیم و تعریف کنیم کجا در دسترس باشند از این روش استفاده میکنیم . در مجموع ما ۳ حالت نمایش داریم
- public
- protected
- private
همچنین متد ها و خواص میتوانند به حالت static نیز تعریف شوند که برای استفاده از آن ها نیازی به تعریف کلاس و ساخت یک شی از آن ها نیست .
خواص و متد های public در شی گرایی
این ها خواص و متد هایی هستند که همه جا ( چه زمان تعریف شی که در کلاس ) قابل دسترسی هستند و میتوانیم آن ها را ویرایش/خواندن کنیم.
خواص و متد های protected در شی گرایی
این خواص و متدها فقط در درون همان کلاس و یا در کلاس های فرزند قابل دسترسی هستند . برای مثال :
<?php
class Model {
protected $db = "library";
public $host= "localhost";
public function getDB(){
return $this->db ;
}
}$m = new Model();
echo $m=>host;
echo $m->db; // با خطا مواجه می شود
echo $m->getDB();
خواص و متد های private در شی گرایی
این خواص و متد ها فقط در کلاسی که در آن تعریف شده اند قابل دسترسی اند . یعنی شما در کلاس فرزند نمی توانید به آن دسترسی داشته باشید .
خواص و متد های static در شی گرایی
این کلید واژه ربطی به ۳ کلید واژه قبلی ندارد یعنی یک متد یا خاصیت میتواند همزمان این کلیدواژه و یکی از سه کلیدواژه قبلی را داشته باشد .
به متد ها و خواصی که به شکل static تعریف شده باشند میتوانیم بدون این که ابتدا یک شیء از کلاس بسازیم به متد ها و خواص کلاس دسترسی داشته باشیم .
کار بسیار راحت است ، ابتدا نام کلاس را می آوریم سپس از عبارت :: استفاده میکنیم و بعد از آن نام خواصیت یا متد را می آوریم.
<?php
class Model {
public static $db = "library";
}
echo Model::db;
یکی از کاربرد های static ذخیره کردن مقادیری است که میخواهیم در طول پروژه آن را تغییر دهیم . بعبارتی متغیرهای استاتیک داخل کلاس در ابتدای اجرای برنامه ایجاد می شوند، بین همه اشیای برنامه مشترک هستند و در کل قسمت های برنامه می توانند دستیابی شوند.
در قسمت بعدی در ادامه آموزش MVC با PHP به توضیح جزئیات کلاس های MVC خواهیم پرداخت ، پس با ما همراه باشید.