با قسمت چهارم از سری آموزشی برنامه نویسی شیء گرای PHP در آکادمی روکسو در خدمت شما هستیم. در این قسمت به مفاهیم Setter، Getter و Constructor میپردازیم. اگر تا به حال از IDE های برنامه نویسی استفاده کرده باشید به احتمال زیاد این مفاهیم را به چشم خود دیده اید اما شاید تا امروز در پروژه های خود آنها را بکار نگرفته باشید.
آیا تا به حال فکر کرده اید که آنها به چه دردی میخورند؟ اما قبل از بحث در رابطه با این مفاهیم باید با کلید واژه ی this$ آشنا شوید.
this$ (به معنی "این" در فارسی - اشاره به شیء مذکور) برای دسترسی به متدها یا خصوصیت ها در درون یک کلاس استفاده می شود.
الگوی استفاده از این کلید واژه به این صورت است:
$this -> propertyName; $this -> methodName();
نکته: توجه داشته باشید که در قسمت های قبلی به شما گفتیم که در کنار نامِ خصوصیات و متدها نمی توان از $ استفاده کرد اما کلید واژه ی this$ همیشه این علامت را با خود دارد.
حالا به مثال زیر توجه کنید:
class Car { // The properties public $model; public $color = 'black'; public $hasHorn = true; public function showCar() { return "Beep I am a <i>" . $this -> model . "</i>, and I am <i>" . $this -> color; } }
نکات در مورد نمونه کد بالا:
در مثال بالا برای خصوصیت model چیزی تعریف نکردیم بنابراین در این قسمت نتیجه ای نشان داده نمی شود. پس بیایید دانش قسمت های قبلی را با این قسمت ترکیب کنیم و یک شیء جدید از این کلاس Car بسازیم:
$bmw = new Car();
در اینجا فرض کرده ایم که مدل خودروی ما BMW است به همین دلیل اسم شیء را BMW گذاشته ایم. خب حالا که شیء جدیدی از این کلاس ساختیم باید به خصوصیاتش مقدار بدهیم تا با دستورات قبلی چیزی نمایش داده شود:
$bmw -> model = "BMW"; $bmw -> color = "blue";
حالا مقدار خصوصیتِ model برابر با BMW است، اما احتمالا سوالی برای شما پیش آمده؛ ما مقدار color را در خودِ کلاس تعیین کردیم، چطور این عمل را دوباره در خارج از کلاس انجام می دهیم؟ پاسخ ساده است.
به شما گفته بودیم که کلاس ها فقط الگوهایی کلی هستند و نیازی نیست تا اشیاء ساخته ی شده ی ما همگی عیناً شبیه هم باشند. اگر شیء ای که ساخته ایم خصوصیات متفاوتی نسب به خصوصیات کلی کلاس دارد میتوانیم آن را تغییر دهیم.
حالا که مقدار model هم تعیین شد میتوانیم متد showCar را صدا بزنیم تا خروجی را به ما نمایش دهد. خروجی این کد عبارت زیر خواهد بود:
Beep I am a BMW, and I am blue.
توجه کنید که BMW و blue به حالت مُوَرب (italic) نوشته شده اند چرا که در سورس کد از تگ <i> استفاده کرده ایم. اگر نمی دانید تگ <i> چیست به تگ <i> در HTML مراجعه کنید.
سوال: اگر خصوصیتی که تعریف کرده ایم private باشد چطور؟ چطور می توانیم آن را تغییر دهیم؟
پاسخ: این کار مخصوص setter ها (به معنی "تنظیم کننده") و getter ها (به معنی "دریافت کننده") است! نگران نباشید، اینها چیز خاصی نیستند! با یک مثال ساده خدمتتان توضیح میدهم.
همان مثال قبلی و کلاس Car را تصور کنید. اگر خصوصیت model را به صورت private تعریف کنیم چه می شود؟
class Car { // مرحله 1 private $model; // مرحله 2 public function setModel($model) { $this -> model = $model; } // مرحله 3 public function getModel() { return "The car model is " . $this -> model; } }
توضیحات:
$this -> model = $model;
این کد می گوید مدلِ (model) هر شیء ای (this$) که با این setter تغییر کند برابر با مدلی است که به متد داده شده است؛ یعنی مقداری که داخل پرانتز قرار بگیرد. زمانی که با این کد، مدلِ یک شیء را تغییر بدهیم متوجه می شوید، صبور باشید!
return "The car model is " . $this -> model;
همانطور که مشخص است getter ها فقط دریافت کننده هستند و هیچ مقداری را تغییر نمی دهند.
این دستور می گوید رشته ی "The car model is " را به مدلِ ماشین بچسبان و به ما تحویل بده (return کن!).
اگر قبلا مقداری برای model ثبت نشده باشد طبیعی است که getter چیزی پیدا نمی کند و با خطا مواجه می شوید.
حالا بیایید کار را عملی کنیم:
$BMW = new Car(); //مرحله 1 $BMW -> setModel("Bayerische Motoren Werke"); //مرحله 2 echo $BMW -> getModel();
توضیحات کد:
ابتدا یک شیء از کلاس Car ساخته و اسم آن را BMW گذاشتیم. سپس،
مرحله 1: با استفاده از متد setter، که قبلا در درونِ خودِ کلاس نوشته بودیم، مقدار آن را برابر با "Bayerische Motoren Werke" قرار می دهیم. این عبارت مخفف نام شرکت BMW است.
مرحله 2: با دستور echo از مدلِ ماشین خروجی گرفته ایم.
اگر از IDE های خوب مانند PHPStorm استفاده می کنید، باید بدانید این IDE ها توانایی ایجاد setter و getter ها را به صورت اتوماتیک برای شما دارند.
مطمئن هستم به همین سادگی با مفاهیم setter و getter آشنا و متوجه شدید که در عین سادگی تا چه حد در کار ما موثر هستند. اگر برای کلاس های خود setter و getter تعریف نکنید باید بدانید دیگر به مقادیر خصوصیات private دسترسی نخواهید داشت. بنابراین قبل از تعریف کلاس باید به این موارد فکر کنید و بر اساس نیاز خود تصمیم بگیرید.
constructor ها در واقع یکی از چندین متد های جادویی در PHP هستند که از قبل تعریف شده اند. زمانی که یک شیء از یک کلاس خاص ساخته می شود، PHP سریعاً به دنبال متد constructor (در فارسی به معنی "سازنده") می گردد. همانطور که از اسم constructor ها مشخص است کارشان این است که به محض ساخته شدن یک شیء، برای آن مقادیر خصوصیت ها و غیره را می سازند.
class Car{ private $model; public function __construct($model) { $this -> model = $model; } }
اگر چنین کدی داشته باشیم و سپس یک شیء از آن به صورت زیر بسازیم:
$car1 = new Car();
نتیجه خطای زیر خواهد بود:
Warning: Missing argument 1 for Car::__construct()
امیدوارم از این قسمت نیز استفاده ی کافی را برده باشید. تا قسمت بعد، در پناه حق.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.