جلسه دوازدهم PHP : آموزش کامل زبان برنامه نویسی پی اچ پی مقدماتی تا پیشرفته (جلسه دوم شی گرایی در پی اچ پی)
در این مقاله از آموزش پی اچ پی با جلسه دوازدهم PHP در خدمت شما هستیم. در قسمت قبل در جلسه یازدهم PHP مبحث شی گرایی را آغاز کردیم، به نحوی که در ابتدا مفهومی کلی از این مبحث بیان کردیم. سپس تک به تک مفاهیم شی گرایی را تعریف نمودیم. آنگاه به ساخت اشیا و فراخوانی توابع عضو پرداختیم. با ما همراه باشید تا در این جلسه ادامهی مبحث قبل را ادامه دهیم.
در این جلسه توابع سازنده و مخرب را به خوبی آموزش خواهید دید. همچنین این نوید به شما داده خواهد شد که مبحث وراثت را کاملا موشکافی خواهیم کرد. و سرآخر تفاوت ما بین public،private و protected در کلاس ها را به بهترین شکل ممکن بیان خواهیم کرد. توجه داشته باشید که مبحث شی گرایی را در 3 جلسه آموزش خواهیم داد. جلسه اول شی گرایی ، جلسه دوم شی گرایی ، جلسه سوم شی گرایی
فهرست مطالب
تابع سازنده
توابع سازنده نوع خاصی از توابع هستند که بهطور خودکار هر زمان که یک شی ایجاد میشود، فراخوانی میشوند. ما میتوانیم با بهرهگیری مزیت این حالت برای مقداردهی اولیه به متغیرها و یا انجام عملیاتی خاص استفاده کنیم. PHP یک تابع خاص به نام ()construct__ برای تعریف توابع سازنده فراهم میکند. که ما میتوانیم به تعداد دلخواه آرگومانها را به تابع سازنده منتقل کنیم. با توجه به مثال زیر از جلسه دوازدهم PHP تابع سازندهای برای کلاس Books ایجاد خواهد شد. که مقادیر price و title در زمان ایجاد شی مقداردهی میشود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php class Books { var $price; var $title; function __construct($par1,$par2) { $this->price = $par1; $this->title = $par2; } function getPrice() { echo $this->price . "<br/>"; } function getTitle() { echo $this->title . " <br/>"; } } |
حال برای مقداردهی price و title نیازی به فراخوانی توابع مجزا نداریم. ما میتوانیم 2 متغیر عضو را در زمان ایجاد شی مقداردهی کنیم. مثال زیر را بررسی کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?php class Books { var $price; var $title; function __construct($par1,$par2) { $this->price = $par1; $this->title = $par2; } function getPrice() { echo $this->price . "<br/>"; } function getTitle() { echo $this->title . " <br/>"; } } $physics = new Books( "Physics for High School", 10 ); $maths = new Books ( "Algebra", 15 ); $chemistry = new Books ("Advanced Chemistry", 7 ); $physics->getPrice(); $maths->getPrice(); $chemistry->getPrice(); $physics->getTitle(); $maths->getTitle(); $chemistry->getTitle(); |
خروجی کد بالا به شرح زیر است:
تابع مخرب
همانند تابع سازنده ما میتوانیم یک تابع مخرب با استفاده از ()destruct__ تعریف کنیم. با استفاده از این تابع میتوانیم یک سری دستورها یا کدها را به هنگام تمام شدن پردازش یک کلاس اجرا کنیم. به مثال زیر توجه کنید.
1 2 3 4 5 6 7 |
<?php class Books { public function __destruct() { echo "Object destroyed"; } } $p = new Books(); |
ارث بری
کلاسها میتوانند method ها و properity های کلاسهای دیگر را ارث بری کنند. کلاسی که ارث بری شده است را subclass مینامند. و همچنین کلاسی که از آن ارث بری شده است را parent class مینامند. برای ارث بری از یک کلاس دیگر باید از کلمهی کلیدی extends استفاده کنیم. کلاسی که ارث بری میکند، بهطور خودکار همه ویژگیهایی که در کلاس پدر وجود دارد را دارا میباشد. به مثال زیر توجه کنید. مثال زیر از کلاس Animal ارث بری کرده است.
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php class Animal { public $name; public function hi() { echo "Hi from Animal"; } } class Dog extends Animal { } $d = new Dog(); $d->hi(); |
همپوشانی توابع
تعاریف تابع در کلاسهای فرزند، توابع را با نامهای مشابه در کلاسهای پدر همپوشانی میکنند. در یک کلاس فرزند، ما میتوانیم تعاریف تابع ارث برده شده از کلاس پدر را تغییر دهیم. در مثال زیر توابع getPrice و getTitle همپوشانی شدهاند تا مقادیری را برگردانند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?php class Books { var $price; var $title; function __construct($par1,$par2) { $this->price = $par1; $this->title = $par2; } function getPrice() { echo $this->price . "<br/>"; } function getTitle() { echo $this->title . " <br/>"; } } class newClass extends Books { function getPrice() { echo $this->price . "<br/>"; return $this->price; } function getTitle(){ echo $this->title . "<br/>"; return $this->title; } } |
سطح دسترسی متغیرها (visibility)
ما برای دسترسی به هر متغیر، متد و یا proprety در کلاس میتوانیم سطح دسترسی و یا همان visibility تعریف کنیم. تا به اینجای کار ما تنها از کلمه کلیدی public برای تعریف method ها و proprety ها استفاده میکردیم. اما 2 کلمهی کلیدی دیگر تحت عنوان protected و private نیز وجود دارد.
تفاوت بین public ، private و protected در کلاسها چیست؟
این سه کلمه کلیدی جهت مشخص کردن سطح دسترسی اجزای یک کلاس بهکار میروند. هنگامیکه یک کلاس به همراه اجزای درونی مانند: متغیرها و توابع ایجاد میشود میتوان به سه حالت به آنها دسترسی داشت. عکس زیر از جلسه دوازدهم PHP، بهصورت خلاصه تفاوت بین public، private و protected را به ما نشان میدهد.
Public (عمومی)
در این نوع از دسترسی، متغیر یا تابع در کلاسهای دیگر که ارث بری شدهاند و object های ایجادشده از کلاس قابلدسترسی است. تا به اینجا تمامی مثالهایمان با public بوده است. درصورتیکه نیاز به محدود کردن دسترسی به بخشهای مختلف کلاس را داشته باشیم، باید از private (خصوصی) و یا protected (محافظتشده) استفاده کنیم.
Protected (محافظت شده)
در این نوع از دسترسی، proprety یا تابع، در کلاسی که در آن تعریفشده و کلاسهایی که از این کلاس ارث بری کردهاند، قابلدسترسی است اما در object هایی که از کلاس ساخته میشود، این توابع و متغیرها قابلدسترسی نخواهند بود. یک عضو کلاس میتواند با استفاده از کلمه کلیدی protected قبل از نام آن prtotected شود. با توجه به ساختار زیر از جلسه دوازدهم PHP نمونهای متفاوت از کلاس MyClass را میبینید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php class MyClass { protected $car = "skoda"; $driver = "SRK"; function __construct($par) { // Statements here run every time // an instance of the class // is created. } function myPublicFunction() { return("I'm visible!"); } protected function myPrivateFunction() { return("I'm visible in child class!"); } } |
Private (خصوصی)
در این نوع از دسترسی، proprety یا تابع فقط در کلاسی که در آن تعریفشده است قابلدسترسی است. و در کلاسی که به ارث برده میشود و همچنی در شی هایی که از کلاس ساخته میشوند، قابلدسترسی نیستند. یک عضو کلاس میتواند با استفاده از کلمه کلیدی private قبل از اسم عضو، خصوصی شود. ساختار زیر از جلسه دوازدهم PHP را ملاحظه نمایید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php class MyClass { private $car = "skoda"; $driver = "SRK"; function __construct($par) { // Statements here run every time // an instance of the class // is created. } function myPublicFunction() { return("I'm visible!"); } private function myPrivateFunction() { return("I'm not visible outside!"); } } |
توجه داشته باشید در مثال بالا، زمانی که کلاس MyClass توسط کلاس دیگری ارث بری شود، ()myPublicFunction و همچنین متغیر $driver قابلمشاهده هستند. اما کلاس ارث بری شده هیچ دسترسیای به ()myPrivateFunction و همچنین متغیر car$ نخواهند داشت. زیرا آنها private هستند.
تبریک میگم شما موفق شدید تا جلسه دوازدهم پی اچ پی ، مبحث ” شی گرایی در پی اچ پی (2) ” را پشت سر بگذارید.
با ادامهی مباحث در جلسه سیزدهم PHP شی گرایی را تکمیل میکنیم. با ما همراه باشید.
4 Comments
Join the discussion and tell us your opinion.
Great, I really like it! Youre awesome
thank you my friend?
سلام خسته نباشید
وقتی از دستور construct برای تابعم استفاده میکنم دستور getprice و gettitle رو تعریف نمیشه کرد و اروور میده
راه حل چیه
سلام . با اجازه ی جناب جناب حسین زاده ؛
زمانی که طبق مثال ، تابعی با نام construct__ ایجاد میکنید و به اون تابع دو پارامتر (یعنی part1 و part2) میدید و درون تابع ، هر آرگومان رو به یکی از متغیر های کلاس ( یعنی price و title ) نسبت میدید ، موقعیتی رو فراهم کردید که بتونیم از بیرون از کلاس ، با تعریف یک شیء و بعد با فراخوانی تابع برای اون شیء و دادن مقدار برای آرگومان ها ، به اشیاء خودمون ، مقدار دهی کنیم .
برای ادامه ی کار میتونیم درون کلاس یه تابع با عنوانی که خودمون میخوایم ایجاد کنیم و به تابع دستور بدیم که برای ما ، مقادیری که تابع قبلی ، از هر شی به عنوان آرگومان گرفت رو چاپ کنه . نام دلخواهی که به تابعمون میدیم در واقع همون کلمات getprice و gerTitle مثال جلسه قبل هستند که خب طبیعتا اینجا بی استفاده اند .
برای نمونه این لینک رو ببینید نمونه ایه که الان مینویسم براتون :
https://i.postimg.cc/qqVdS2Q2/Untitled.jpg