عنوان مقاله :

برنامه نویسی شی گرا در php | قسمت چهارم

گردآوری و تالیف : حسام موسوی
تاریخ انتشار : 06 مهر 1394
دسته بندی ها : برنامه نویسی

با سلام خدمت دوستان و کاربران عزیز وبسایت راکت در قسمت های قبل یعنی

در مورد مفهوم برنامه نویسی شی گرا در php و همینطور در مورد property ها و method ها و Encapsulation (کپسوله سازی) صحبت کردیم و با مثال های مختلف اونا رو بهتون یاد دادیم در این جلسه قصد داریم در مورد Inheritance (وراثت) صحبت کنیم  و اونو بهتون آموزش بدم امیدوارم مورد استفاده اتون قرار بگیره . 

Inheritance (وراثت)

امروز میخوام در مورد یک بحث مهم در شی گرائی صحبت کنم و اونم وارثته . خوب اینجا من گفتم وارثت ، اولین چیزی که بعد از شنیدن وراثت به ذهنتون خطور کرد چی بود ؟ بزارین با اون چیزی که به ذهن من خطور کرد این مبحث رو شروع کنیم . اولین چیزی که بعد از شنیدن این کلمه به ذهن من خطور کرد ویژگی هایه که از والدینم به ارث بردم یا مثلا خیلی وقتا خیلی مرضی ها ارثین مثل کچلی که از والدین یا والدینشون به ارث میبرین ( :D )  . اگه این موضوع رو در دنیایی واقعی برای خودتون بازتر کنید و سعی کنید اونو به شی گرایی مرتبط کنید به راحتی میفهمید که چقدر اینا شبیه هم هستن .

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

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

بزارید یک مثال ساده بزنم . در پایین من یک کلاس معمولی به اسم Father میسازم و یک method توش قرار میدم .  

class father
{
    public function getEyeCount() {
        return 2 ;
    }
}

خب حالا که کلاس پدر رو ساختیم میخوام یک کلاس دیگه مثل زیر بسازم به اسم child و به father متصل کنم.

<?php

class child extends father
{
    
}

$obj = new child;
echo $obj--->getEyeCount; // 2

?>

در بالا ما با کمک کلمه کلیدی extends تونستیم کلاس child رو به کلاس father مرتبط کنیم و با استفاده از متدی که در کلاس father هست مقداری رو در کلاس فرزند برگردونیم . 

نکته : به یاد داشته باشید property ها و method های که از نوع private باشن قابلیت ارث بری ندارن و نمیشه در کلاس های فرزند از این نوع method ها و property ها استفاده کرد . 

در اینجا چند مسئله پیش میاد که شاید برای شما هم سوال شده باشه ! مسئله اول اینکه یک کلاس که از کلاس پدر ارث می بره خودش (فرزند) میتونه ویزگی های ( method ها و peroperty های ) خودش رو داشته باشه ؟ مسئله دوم اینکه آیا میشه method ها و property های که در کلاس پدر هست در کلاس فرزند هم دوباره نویسی کرد با یک ویژگی خاص دیگه ؟ بزارید اینجا به این دو مسئله جواب بدیم تا دیگه سوالی در موردش نباشه . 

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

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

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

class MyClass
{
  public $prop1 = "I'm a class property!";
 
  public function setProperty($newval)
  {
      $this->prop1 = $newval;
  }
 
  public function getProperty()
  {
      return $this->prop1;
  }
}
 
class MyOtherClass extends MyClass
{
  public function newMethod()
  {
      echo "From a new method in" . __CLASS__ ;
  }
}
 
// Create a new object
$newobj = new MyOtherClass;
 
// Output the object as a string
echo $newobj->newMethod();
 
// Use a method from the parent class
echo $newobj->getProperty();
 
?>

 نتیجه کد بالا بصورت زیر به نمایش در میاد اما شاید براتون سوال شده باشه که __CLASS__ دقیقا چیه این اسم کلاس رو برامون بر میگردونه . 

From a new method in MyOtherClass.
I'm a class property!

 آیا میشه method ها و property های که در کلاس پدر هست در کلاس فرزند هم دوباره نویسی کرد با یک ویژگی دیگه ؟ 

جواب این مسئله هم بله است ، شما به راحتی مثل کد زیر می تونید همون متدی که در کلاس پدر هست با همون اسم در کلاس فرزند بسازین و دوباره نویسی کنید با ویژگی های جدید اینطوری اول چک میکنه که اون method در کلاس فزرند هست یا خیر اگر بود که برگشت داده میشه و اگر نبود به کلاس پدر میره و دنبال اون method میگرده و اگر بود برمیگردونه.

<?php

class Foo
{
    public function printItem($string)
    {
        echo 'Foo: ' . $string . PHP_EOL;
    }
    
    public function printPHP()
    {
        echo 'PHP is great.' . PHP_EOL;
    }
}

class Bar extends Foo
{
    public function printItem($string)
    {
        echo 'Bar: ' . $string . PHP_EOL;
    }
}

$foo = new Foo();
$bar = new Bar();
$foo->printItem('baz'); // Output: 'Foo: baz'
$foo->printPHP();       // Output: 'PHP is great' 
$bar->printItem('baz'); // Output: 'Bar: baz'
$bar->printPHP();       // Output: 'PHP is great'

?>

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

مقالات پیشنهادی

20 کتابخانه عالی برای php

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

منابع تازه برای توسعه دهندگان Front-end - سری اول

امروزه ابزار ها ، کتابخانه ها و فریمورک های مختلفی بصورت روزانه برای توسعه دهنگاه Front-end ارائه می شود تا آنها بتوانند سریع تر ، بهتر و راحتر پروژه...

15 کتابخانه جالب جاوا اسکریپت و Css - مرداد 95

پیدا کردن ابزار ها و کتابخونه های جاوا اسکریپت و css که هم کاربردی و هم جالب باشه امروزه تقریبا کار مشکلی شده بدلیل اینکه تعداد این ابزارها بسیار زیاد...

برنامه نویسی شی گرا در php | قسمت پنجم

خب امروز در این پست رسیدیم به متدهایی جادوئی در شی گرایی php . در php برای ساده تر کردن بعضی از کارها در کلاس ها یک سری متدهای خاص و ویژه در شی گرایی...

دیدگاه های ارزشمند شما

حسین صادقی | 11 ماه پیش

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

admin | 11 ماه پیش

بله حق با شماست و اصلاح شد دوست عزیز

حسین صادقی | 11 ماه پیش

سلام
ممنون از توضیحاتتون
در این خط
printItem('baz'); // Output: 'Foo: baz'
فکر کنم اشتباه هست. چون ننوشتید که متد پرینت آیتم رو از کدوم شی بخونه.
اگر اشتباه نیست، چطور رفته از پدر خونده در صورتی که در فرزند هم موجوده

admin | 11 ماه پیش

بله اشتباهه باید از شی Foo بخونه و نمایش بده

امین شاکر | 1 سال پیش

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

امین شاکر | 1 سال پیش

منظورم این نیست که کدهای php اشتباهن. منظور به طور ناقص درج شدن شما به سطر بعد این نوشته دقت کنید:
"بزارید یک مثال ساده بزنم . در پایین من یک کلاس معمولی به اسم Father میسازم و یک method توش قرار میدم . "

با تشکر.

admin | 1 سال پیش

بله حق با شما بود مشکل این پست حل شد

admin | 1 سال پیش

مرسی حتما چک میشه ولی فک کنم تا اونجای که میدونم درستن

jahan | 1 سال پیش

خیلی ممنونم
برای من که خیلی مفید بود.

bahar | 1 سال پیش

سلام ممنون خیلی شیوا توضیح دادید.
سایت شما برای فراگیری مطلب oop سایت خوبیه. امیدوارم هم ادامه داشته باشه و هم سریعتر ادامه مطالب رو بزاید چون خیلیا منتظر مبحث بعدیش هستند.فقط ی سوال PHP_EOL; چیه که آخر دستوراتتون نوشتید؟

admin | 1 سال پیش

چشم حتما ادامه میدیم
PHP_EOL هم هر کجا استفاده بشه خط فعلی رو به اول خط بعدی منتقل میکنه مثل "n\"

محمدامین | 1 سال پیش

سلام.
خیلی عالی بود،سپاسگزارم