کلاس ها و ویژگی ها

درسنامه درس 2 از سری شی گرایی در PHP
php-oop-classes-methods-properties

با قسمت دوم از سری برنامه نویسی شیء گرای PHP در خدمت شما هستیم. در این قسمت قصد داریم تا به سراغ کدنویسی رفته و از مباحث اولیه جلوتر برویم. اگر با مباحث اولیه آشنا نیستید می توانید قسمت اول این سری را مطالعه کنید.

نکته: همانطور که در قسمت اول گفته شد، این سری از آموزش ها برای افرادی که هیچ آشنایی با زبان PHP ندارند مناسب نیست. برای استفاده ی کامل از این سری آموزشی باید آشنایی حداقلی با مفاهیم برنامه نویسی (مخصوصا برنامه نویسی PHP) داشته باشید.

ساختار کلاس (Class) در PHP

تعریف یک کلاس در PHP با کلمه ی class و سپس دو عدد آکولاد ({}) شروع می شود. این آکولاد ها شامل constant ها (ثابت ها) و متغیر ها (همان "خصوصیات" که در قسمت قبل اشاره شد) و توابع (همان "متد ها") می شوند.

نکته: تمام متغیر های یک کلاس property (خصوصیت) نیستند بلکه یک property نوعی خاص از یک متغیر است. در آینده به سادگی متوجه این تفاوت می شوید.

نکته: در برنامه نویسی PHP عبارت “property” با عبارت “attribute” و عبارت “method” با عبارت “operation” یکی در نظر گرفته می شود. اگر در منابع دیگر این کلمات را به جای هم دیدید تعجب نکنید!

بنابر چیزی که گفته شد ساختار یک کلاس خالی و ساده در PHP به این شکل است:

<?php
class Myclass
{      
 // Add property statements here
 // Add the methods here
} 
?>

نکات مهم در مورد کلاس ها:

  • نام گذاری کلاس ها باید به این شکل باشد که با یک حرف انگلیسی یا آندرلاین شروع شده و در ادامه ی آن از حروف، اعداد و یا آندرلاین استفاده شود. حالتی غیر از این مجاز نمی باشد.
  • نام کلاس ها طبق قرارداد با حرف اولِ بزرگ شروع می شود؛ مانند Myclass یا Validationclass و ... .
  • نمونه یا instance همان شیء ای است که از یک کلاس ساخته می شود. بنابراین اگر از کلاس بالا (Myclass) شیء ای ساختیم، آن شیء می شود یک instance از کلاسِ Myclass.
  • اگر بخواهیم خارج از یک کلاس، شیء ای بسازیم باید از کلمه ی new استفاده کنیم. در ادامه بیشتر با این مسئله آشنا می شویم.

حالا یک مثال (مثال شماره 1) میزنیم:

<?php    
$myobj = new MyClass; 
?>

با استفاده از کد بالا یک instance (همان شیء یا نمونه) از کلاس Myclass ساختیم و از آنجا که این نمونه را خارج از کلاس ساختیم از کلمه ی new استفاده کردیم.

از کجا بدانیم خارج از کلاس بوده است؟ اگر دقت کنید قبلا کلاس Myclass را تعریف کردیم و داخلش چیزی نگذاشتیم (یعنی بین دو آکولاد را خالی گذاشتیم). داخل آکولاد یعنی داخل کلاس!

حالا به $myobj دقت کنید. همانطور که میبینید دقیقا مانند یک متغیر عادی در PHP است، اما یک متغیر عادی نیست بلکه یک شیء است. این شیء به ما اجازه ی دسترسی به تمام متد های کلاس Myclass را میدهد؛ بدون داشتن این شیء شما به هیچ عنوان نمی توانید از این متد ها استفاده کنید.

اگر برای تست این شیء را داخل دستور var_dump() قرار دهیم خروجی زیر را می‌گیریم:

var_dump($myobj);

خروجی:

object(Myclass)#1 (0) { }

تا اینجا با کلیت کلاس و شیء آشنا شدیم و یک مثال هم از آن بیان کردیم. حالا باید برویم سراغ property ها و method ها، اما قبل از آن چند کلام حرف خودمانی!

اگر کمی گیج شده اید، باید بگویم کاملا طبیعی است؛ این روش یک روش متفاوت برنامه نویسی است و اگر شما تا به حال با آن آشنایی نداشته اید احتمالا در اوایل کار برایتان گیج کننده خواهد بود.

نکته ای که باید به آن توجه کنید این است که با جلو رفتن مطالب شما کاملا به آن مسلط می شوید و ابهامات ذهنی شما به علت ندانستن کامل موضوع است نه سخت بودن آن.

ایجاد خصوصیات (property) در PHP

قبلا در مورد اینکه property چیست، صحبت کردیم. باید بدانید property ها داده های مرتبط با کلاسی که در آن تعریف شده اند را در خودشان نگه می دارند. برای ایجاد این property ها در یک کلاس باید از یکی از سه واژه ی public، protected یا private استفاده کرده و سپس یک متغیر عادی تعریف کرد. اگر متغیر را با کلمه ی کلیدی var بسازید، آن property به صورت خودکار public خواهد شد. معنی این کلمات از قرار زیر است:

  • Public: در این حالت، property مورد نظر خارج از کلاس نیز قابل دسترسی است؛ چه به صورت عادی در اسکریپت ما و چه از طریق کلاسی دیگر.
  • Private: هیچ دسترسی از خارج از کلاس داده نخواهد شد؛ چه از طریق اسکریپت و چه از طریق کلاسی دیگر.
  • Protected: هیچ دسترسی از خارج از کلاس داده نخواهد شد مگر از کلاسی که فرزندِ کلاسِ مورد نظر باشد.

مثال: زمانی که یک نمونه از یک کلاس ساخته شد می توانید به هر property آن با استفاده از الگوی زیر دست پیدا کنید:

Object->

به مثال زیر (مثال شماره 2) دقت کنید:

<?php   
class Myclass
{
 public $font_size =10;
}
$f = new MyClass;
echo $f->font_size;
?>

در این مثال ما کلاسی به اسم Myclass تعیین کردیم و یک Property یا خصوصیت به نام $font_size در آن قرار دادیم و مقدار آن را هم 10 گذاشتیم.

توجه کنید چون ما به زبان فارسی توضیح می دهیم معمولا علامت دلار $ جلوی عبارت قرار می گیرد و صحیح نیست اما در کدنویسی چون متن چپ چین است مشکلی پیش نمی آید

حالا برای اینکه به این Property دسترسی داشته باشیم اول یک نمونه از کلاسِ Myclass را به نام $f می سازیم؛ باید تا الان یاد گرفته باشید که $f یک شیء یا نمونه از کلاسِ Myclass است. بر اساس الگوی object-> می نویسیم: $f->font_size. بنابراین در ادامه با این دستور، مقدار font_size به شیء $f داده می شود. حالا برای آنکه این مقدار را روی صفحه ببینیم دستور echo را هم در اول دستور قرار می دهیم. خروجی این دستور عدد 10 می باشد.

نکته‌ی مهم: بسیاری از برنامه نویسان این اشتباه را می کنند که دستور فوق را به صورت زیر می نویسند:

echo $f->$font_size

چرا چنین دستوری غلط است؟ علامت دلار در زمان تعریف یک خصوصیت در خودِ کلاس آورده میشد نه در زمان استفاده از آن. زمانی که بخواهیم به یک خصوصیت دسترسی داشته باشیم تنها اسم آن را (بدون علامت دلار) می آوریم.

ایجاد متد (method) در PHP

میدانیم که متد ها همان توابع در داخل کلاس ها هستند؛ در واقع این متد ها عیناً همان توابع در PHP هستند. برای ایجاد یک متد در یک کلاس از یکی از کلمات کلیدی زیر استفاده کنید و سپس متد را مانند یک تابع عادی تعریف کنید:

  • Public: در این حالت، متد ما خارج از کلاس نیز قابل دسترسی است.
  • Private: هیچ دسترسی از خارج از کلاس نخواهیم داشت.
  • Protected: هیچ دسترسی از خارج از کلاس داده نخواهد شد مگر از کلاسی که فرزندِ کلاسِ مورد نظر باشد.

اگر در هنگام تعریف متد از هیچ کدام از این سه کلمه ی کلیدی استفاده نکنید، حالت پیش فرضِ متد public خواهد بود.

همچنین برای نام گذاری متد ها مانند نام گذاری کلاس ها عمل کنید؛ یعنی نام گذاری متد ها باید به این شکل باشد:

شروع نام با حروف انگلیسی یا آندرلاین + حروف یا اعداد یا آندرلاین

توجه کنید که نیازی نیست تمام این موارد در اسم یک متد یا کلاس باشد. این فقط یک فرمول کلی است؛ یعنی اگر مثلا در نام متد از اعداد استفاده نکردید مشکلی ندارد و این موارد اجباری نیستند (به غیر از پیروی از الگوی کلی).

شروع تعریف متد با "{" و پایان آن هم با "}" است. همانطور که در قسمت اول گفتیم، نام این علامت curly braces است و نباید آن را با براکت ([]) اشتباه گرفت.

به مثال زیر (مثال شماره 3) دقت کنید. در این مثال میخواهیم متدی تعریف کنیم که رشته ای را با اندازه‌ی فونت و رنگ خاصی چاپ کند و آن را داخل یک تگ <p> قرار دهد.

<?php   
class Myclass
{
 public $font_size ="18px";
 public $font_color = "blue";
 public $string_name = "roxoAcademy";
 public function customize_print()
 {
 echo "<p style=font-size:".$this->font_size.";color:".$this->font_color.";>".$this->string_name."</p>";
 }
}
$f = new MyClass;
echo $f->customize_print();
?>

خروجی این دستور عبارت roxoAcademy با رنگ آبی و فونت 18 خواهد بود که داخل تگ <p> قرار داده شده است.

حال سوالی که پیش می آید این است که ما گفتیم از الگوی object-> برای دسترسی به متد ها یا خصوصیات یک کلاس استفاده می کنیم. آیا می توانیم از طریق این دسترسی، property ها را تغییر دهیم؟ جواب بله است! برای مثال کد قبلی را عیناً می نویسیم و سپس مقادیر property ها را تغییر می دهیم.

<?php   
class Myclass
{
 public $font_size ="18px";
 public $font_color = "blue";
 public $string_name = "roxoAcademy";
 public function customize_print()
 {
 echo "<p style=font-size:".$this->font_size.";color:".$this->font_color.";>".$this->string_name."</p>";
 }
}
$f = new MyClass;
$f->font_size = "20px";
$f->font_color = "red";
$f->string_name = "PHP OOP with Amir Zouerami";
echo $f->customize_print();
?>

خروجی این کد عبارت PHP OOP with Amir Zouerami خواهد بود که فونت 20 و رنگ قرمز خواهد داشت.

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

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری شی گرایی در PHP توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما (7 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

مهرداد
05 فروردین 1400
اونجا که echo کردید خروجی roxo academy را یه بار داخل متد echo شده و یه بار هم موقع instance ساختن. echo $f->customize_print در حالی که بار دوم نیازی نبود. من بدون echo دوم خروجی گرفتم.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

افشین
29 آبان 1399
آقا دمت گرم. توضیحاتت عالی بودن. بسیار کامل و در عین حال روون و قابل فهم. من سایتای مختلف رو گشتم واسه مبحث شی گرایی تو پی اچ پی، هیچکدوم مثل شما نبود. بازم دمت گرم

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

من
10 شهریور 1399
آندرلاین => آندرسکور

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

Jafar
31 خرداد 1399
سایت بسیار خوبی دارید ممنونم

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

جواد
09 خرداد 1398
درود و سپاس

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

امیر زوارمی
09 خرداد 1398
سلام دوست عزیز، خوشحالم که مقاله مورد توجه شما بوده.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

Ahmad_Tavakoli
06 دی 1397
سلام آقای زوارمی. من از مطالبتون توی قسمت سئو خیلی استفاده کردم و الان دیدم که برنامه نویسی پی اچ پی هم کار میکنین! سوالی ندارم و فقط خواستم بخاطر واضح و مفید بودن کلامتون ازتون تشکر کنم. فقط یه نکته ای هست. لطف کنید اگه میشه زودتر قسمت ها رو بزارین آخه من خیلی مشتاق هستم. ممنونم

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

امیر زوارمی
07 دی 1397
سلام خدمت شما نظر لطف شماست، خوشحالم که استفاده کردید از مطالب. بنده دانشجو هستم و به خاطر درگیری های دانشگاه کمی وقت کم میارم، از شما عذر میخوام. ان شاء الله سعی می کنم وقتم رو بیشتر خالی کنم اما متاسفانه درگیری ها خیلی زیاد هست.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

مهدوی
02 دی 1397
باسلام واحترام ممنون بابت آموزش خوبتون در انتهای متن آموزشی درعبارت"خروجی این کد عبارت PHP OOP with Amir Zouerami خواهد بود که فونت 12 و رنگ قرمز خواهد داشت." فونت 12 اشتباه است خروجی فونت 20 صحیح است.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

روکسو
03 دی 1397
با تشکر از دقت شما اصلاح شد.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.