آموزش PHP: جلسه بیست و سوم: شیءگرایی (بخش سوم)

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

در دو جلسه‌ی قبلی ۱۱ مرحله مختلف را گذراندیم تا مبحث شیءگرایی را در پی‌اچ‌پی به روش عملی یاد بگیریم. در ادامه به سراغ مراحل بعدی می‌رویم.

مرحله دوازدهم:

دسترسی مستقیم به پروپرتی‌ها (توصیه نمی‌شود)

برای دسترسی مستقیم به خواص اشیاء ساخته شده در پی‌اچ‌پی، نیازی به استفاده از متدها ندارید. شما می‌توانید به‌طور مستقیم با استفاده از عملگر <- و نام متغیر (پروپرتی) موردنظر، به آن دسترسی داشته باشید.

به عنوان مثال اگر در کلاس پی‌اچ‌پی نوشته شده‌ی خود، یک پروپرتی به نام name$ (در شیء mojtaba$) داشته باشید، برای دسترسی به مقدار این متغیر باید از کدی مثل زیر استفاده کنید:

$name = $mojtaba->name;

البته همان‌طور که اشاره کردیم، استفاده از این روش پیشنهاد نمی‌شود چرا که امکان دارد در ادامه مسیر، با مشکلاتی مواجه شوید. برای دسترسی به مقادیر متغیرها (پروپرتی‌ها) در یک کلاس پی‌اچ‌پی، بهتر است از متدهای دریافت‌کننده یا همان Getter استفاده کنید.

به کد زیر توجه کنید تا آنچه گفته شد را بیشتر درک کنید.

<?php include(“class_lib.php”); ?>
<?php
$mojtaba = new person();
$miaad = new person;

$mojtaba->set_name(“mojtaba bolhasani”);
$miaad->set_name(“miaad baferasat”);

// دسترسی مستقیم به مقدار یک پروپرتی در کلاس که پیشنهاد نمی‌شود
echo “mojtaba’s full name: “.$mojtaba->name;
?>

مرحله سیزدهم:

کانستراکتورها (constructor)

در تمامی کلاس‌های پی‌اچ‌پی می‌توان متدهایی موسوم به کانستراکتور را تعریف کرد که در واقع یک متد داخلی آن کلاس محسوب می‌شود. کانستراکتورها به شما اجازه می‌دهند تا خواص موردنظر کلاس خود را تعریف کنید. بدین طریق به محض ساختن و فراخوانی چنین کلاسی، متد کانستراکتور آن کلاس به صورت خودکار اجرا خواهد شد.

نکته: اگر تابعی به نام ()constructــ در کلاس موردنظرتان بسازید، پی‌اچ‌پی به‌طور خودکار متد (تابع) ()constructــ را پس از ساختن هر شیء و در واقع پس از اجرای کلاس، فراخوانی می‌کند.

به یاد داشته باشید که برای تعریف کانستراکتور در ابتدای نام آن باید دو علامت آندراسکور (آندرلاین ــ) قرار دهید و بدون هیچ فاصله‌ یا کاراکتر اضافه‌ای، کلمه‌ی construct را در ادامه‌ی نام آن بنویسید. برای درک بیشتر موضوع، به کد زیر توجه کنید:

<?php
class person {
var $name;
function __construct($persons_name) {
$this->name = $persons_name;
}

function set_name($new_name) {
$this->name = $new_name;
}

function get_name() {
return $this->name;
}

}
?>

از حالا به بعد به منظور پیش‌برد راحت‌تر و یکپارچه‌تر مبحث شی‌ءگرایی در پی‌اچ‌پی، هر جا صجبت از متد شد منظور ما تابع داخل کلاس است و هرجا از پروپرتی‌ها سخن گفتیم، منظور ما همان متغیرهای کلاس هستند.

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

مرحله چهاردهم:

ساختن یک کلاس (شیء) مجهز به کانستراکتور

حالا که ما با نحوه‌ی ساختن کانستراکتور آشنا شده‌ایم، می‌توانیم برای ساخت کلاس person، مقداری را به عنوان پیش‌فرض برای پروپرتی name$ مشخص کنیم. 

شما می‌توانید ورودی‌های مختلفی را به صورت آرگومان‌، برای متد کانستراکتور تعیین کنید. اگر با این موضوع آشنایی ندارید بد نیست سری به بخش آموزش توابع در پی‌اچ‌پی بزنید که پیش‌تر آن را در وبلاگ منتشر کرده‌ایم. برای افزودن ورودی به کانستراکتور، باید پس از استفاده از یک شیء ورودی‌ها را در داخل پرانتز و پس از نام کلاس موردنظر، وارد کنیم. به عنوان مثال به کد زیر توجه کنید:

$mojtaba = new person(“mojtaba bolhasani”);

استفاده از کانستراکتور و مقداردهی ورودی موردنیاز آن باعث می‌شود تا دیگر نیازی به فراخوانی متد ()set_name نداشته باشیم که همین کار باعث می‌شود با نوشتن کد کمتر، بتوان پروژه‌های مسنجم‌تری را ساخت. استفاده از کانستراکتورها همانند سایر زبان‌ها نظیر جاوا و … در بین برنامه‌نویسان این زبان، رایج است. باز هم توجه شما را به مثال زیر جلب می‌کنیم:

<?php include(“class_lib.php”); ?>
<?php
$mojtaba = new person(“mojtaba bolhasani”);
echo “mojtaba’s full name: “.$mojtaba->get_name();
?>

استفاده از مکانسیم شی‌ءگرایی در مثال بالا، یکی از کاربردهای بسیار ساده‌ای است که می‌تواند در زمان و انرژی شما در کدنویسی صرفه‌جویی قابل توجهی کند. به یاد داشته باشید که برنامه‌نویسان حرفه‌ای این نکته را خوب می‌دانند: کد کمتر برابر است با باگ کمتر.

مرحله پانزدهم:

محدود کردن دسترسی به پروپرتی‌ها با اصلاح‌کننده‌های دسترسی

یکی از اصول بنیادی در برنامه‌نویسی شیءگرا، کپسوله‌سازی (encapsulation) است. اگر قصد دارید تا دسترسی به پروپرتی‌های مختلف را در کلاس خود محدود کنید، این ایده به شما کمک می‌کند تا کد خوانا‌تر و بهتری را تولید کنید.

برای محدود کردن دسترسی به پروپرتی‌های کلاس خود، باید از اصلاح‌کننده‌های دسترسی (ٰaccess modifiers) استفاده کنید. در پی‌اچ‌پی نیز مثل بسیاری از زبان‌های خانواده‌ی سی، ۳ عدد اصلاح‌کننده دسترسی موجود است:

  1. public (عمومی)
  2. private (خصوصی) 
  3. protected (محافظ شده)

اصلاح‌کننده‌ی پیش‌فرض برای هر پروپرتی در هر کلاس در پی‌اچ‌پی، Public است. به مثال زیر توجه کنید:

<?php
class person {
var $name;
public $height;
protected $social_insurance;
private $pinn_number;

function __construct($persons_name) {
$this->name = $persons_name;
}

function set_name($new_name) {
$this->name = $new_name;
}

function get_name() {
return $this->name;
}

}
?>

نکته: زمانی که شما یک پروپرتی را با استفاده از کلمه‌ی کلیدی var تعریف کنید، آن پروپرتی به صورت پیش‌فرض عمومی (Public) خواهد بود.

مرحله شانزدهم:

محدود کردن دسترسی به پروپرتی‌ها: بخش دوم

هنگامی که یک پروپرتی را در کلاس‌های پی‌اچ‌پی از نوع private تعیین کنیم، فقط برخی از کلاس‌های دیگر می‌توانند به مقدار این پروپرتی دسترسی داشته باشند.

هنگامی که یک پروپرتی را در کلاس‌های پی‌اچ‌پی از نوع protected تعیین کنیم، فقط برخی از کلاس‌های مشتق شده از کلاس موردنظر، امکان دسترسی به پروپرتی‌ یاد شده را خواهند داشت. مشتق شدن و مباحث مربوط به ارث‌بری در کلاس‌های پی‌اچ‌پی را بعدا به شما آموزش خواهیم داد.

پروپرتی‌هایی که به صورت Public تعریف شده‌ باشند، محدودیت دسترسی نداشته و این یعنی هر کسی و هر کلاسی می‌تواند به مقدار آن‌ها دسترسی یابد.

به منظور فهم بیشتر این بخش تقریبا فرار از شیءگرایی در پی‌اچ‌پی، کد زیر را به دقت مشاهده کرده و آن را خودتان نیز تمرین، تا نتیجه را مشاهده کنید. برای درک بهتر کدها، کامنت‌های موجود در مثال زیر را نیز مطالعه کنید.

<?php include(“class_lib.php”); ?>
<?php
$stefan = new person(“Stefan Mischook”);
echo “Stefan’s full name: ” . $stefan->get_name() ;

/*
Since $pinn_number was declared private, this line of code
will generate an error. Try it out!
*/

echo “Tell me private stuff: “.$stefan->pinn_number;
?>

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

‘Fatal error: Cannot access private property person::$pinn_number in …’

مرحله هفدهم:

محدود کردن دسترسی به متدها درست همانند پروپرتی‌ها، شما می‌توانید دسترسی به متدهای تعریف شده در یک کلاس را با استفاده از ۳ اصلاح‌کننده زیر کنترل کنید.

  1. public (عمومی)
  2. protected (محافظت شده)
  3. private (خصوصی)

به‌طور خلاصه: امکان کنترل کردن دسترسی به متدهای هر کلاس، باعث می‌شود تا بتوانیم روش استفاده‌ی دیگران از آن کلاس را کنترل کنیم.

احتمالا شما هم متوجه شده‌اید که استفاده از محدودکننده‌های دسترسی و دیگر ساختارهای برنامه‌نویسی شیءگرا، کمی زیرکانه خواهد بود. این مورد برای افرادی که به تازگی شروع به یادگیری شیءگرایی کرده‌اند، بیشتر محسوس است. پس بهتر است شما نیز به خود شانسی بدهید و شروع به یادگیری و استفاده از این روش کنید.

با توجه به آنچه اشاره شد، باید بگوییم که ساختار یکپارچه‌ی برنامه‌نویسی شیءگرا باعث می‌شود تا بتوان روی پروژه‌های موجود که با این روش ساخته شده‌اند کار کرد یا پروژه‌های گروهی را به‌طور استانداردتر پیش برد. به کد زیر توجه کنید:

<?php
class person {
var $name;

public $height;
protected $social_insurance;
private $pinn_number;

function __construct($persons_name){
$this->name = $persons_name;
}

private function get_pinn_number(){
return
$this->pinn_number;
}
}
?>

نکته: از آنجا که متد ()get_pinn_number یک متد از نوع خصوصی (private) است، تنها جایی که می‌توان از این متد استفاده کرد، در همین کلاس است. اگر قصد دارید متدهای موردنظر خود را در صفحات پی‌اچ‌پی خود به‌طور مستقیم فراخوانی کنید، مسلما باید آن متدها را به صورت عمومی یا همان Public تعریف کرده باشید.

نکته اضافه: مجددا ذکر این مورد بسیار مهم است که بگوییم شما خودتان باید دست به‌کار شده و کدها را به‌طور عملی بنویسید و سپس آن‌ها را تست کنید. این کار باعث می‌شود تا موضوع موردبحث را بهتر درک کنید.

امیدواریم تا به اینجای مبحث، تمام مراحل را به ترتیبی که گفته شده فرا گرفته باشید. در صورتی که سوالی در مورد مباحث مطرح شده دارید، در بخش نظرات می‌توانید آن‌ را مطرح کنید.

 منبع زومیت

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.