در ادامه جلسه قبل در این قسمت نیز به شئ گرایی در php می پردازیم.
مرحله دوازدهم:
دسترسی مستقیم به پروپرتیها (که توصیه نمیشود)
برای دسترسی مستقیم به خواص اشیاء ساخته شده در پیاچپی، نیازی به استفاده از متدها ندارید. شما میتوانید به طور مستقیم با استفاده از عملگر <- و نام متغیر (پروپرتی) مورد نظر، به آن دسترسی داشته باشید. به عنوان مثال اگر در کلاس پیاچپی نوشته شدهی خود، یک پروپرتی به نام name$ (در شیء mohammad$) داشته باشید، برای دسترسی به مقدار این متغیر باید از کدی مثل زیر استفاده کنید:
$name = $mohammad->name;
البته همانطور که اشاره کردیم، استفاده از این روش پیشنهاد نمیشود چراکه امکان دارد در ادامه مسیر، با مشکلاتی مواجه شوید. برای دسترسی به مقادیر متغیرها (پروپرتیها) در یک کلاس پیاچپی، بهتر است از متدهای دریافتکننده یا getter استفاده کنید. برای درک بیشتر به کد زیر توجه کنید:
<?php include("class_lib.php"); ?> <?php $mohammad = new person(); $reza = new person(); $mojtaba->set_name("mohammad safari"); $reza->set_name("reza safari"); // دسترسی مستقیم به مقدار یک پروپرتی در کلاس که پیشنهاد نمی شود echo "mohammad's full name: ".$mohammad->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$ مشخص کنیم. شما میتوانید ورودیهای مختلفی را به صورت آرگومان، برای متد کانستراکتور تعیین کنید. اگر با این موضوع آشنایی ندارید بد نیست سری به بخش آموزش توابع در پیاچپی بزنید که پیشتر آن را در سایت منتشر کردهایم. برای افزودن ورودی به کانستراکتور، باید پس از استفاده از یک شیء ورودیها را در داخل پرانتز و پس از نام کلاس مورد نظر، وارد کنیم. به عنوان مثال به کد زیر توجه کنید:
$mohammad = new person("mohammad safari");
استفاده از کانستراکتور و مقدار دهی ورودی مورد نیاز آن باعث شد تا دیگر نیازی به فراخوانی متد ()set_name نداشته باشیم که همین کار باعث میشود با نوشتن کد کمتر، بتوان پروژههای مسنجمتری را ساخت. استفاده از کانستراکتورها همانند سایر زبانها نظیر جاوا و … در بین برنامهنویسان این زبان، رایج است. باز هم توجه شما را به مثال زیر جلب میکنیم:
<?php include("class_lib.php"); ?> <?php $mohammad = new person("mohammad safari"); echo "mohammad's full name: ".$mohammad->get_name(); ?>
استفاده از مکانسیم شیءگرایی در مثال بالا، یکی از کاربردهای بسیار سادهای است که میتواند در زمان و انرژی شما در کدنویسی صرفهجویی قابل توجهی کند.
مرحله پانزدهم:
محدود کردن دسترسی به پروپرتیها با اصلاحکنندههای دسترسی
یکی از اصول بنیادی در برنامهنویسی شیءگرا، کپسولهسازی (encapsulation) است. اگر قصد دارید تا دسترسی به پروپرتیهای مختلف را در کلاس خود محدود کنید، این ایده به شما کمک میکند تا کد خواناتر و بهتری را تولید کنید.
برای محدود کردن دسترسی به پروپرتیهای کلاس خود، باید از اصلاحکنندههای دسترسی (ٰaccess modifiers) استفاده کنید. در پیاچپی نیز مثل بسیاری از زبانهای خانوادهی سی، ۳ عدد اصلاحکننده دسترسی موجود است:
- public (عمومی)
- private (خصوصی)
- 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 ...'
مرحله هفدهم:
محدود کردن دسترسی به متدها
درست همانند پروپرتیها، شما میتوانید دسترسی به متدهای تعریف شده در یک کلاس را با استفاده از ۳ اصلاحکننده زیر کنترل کنید.
- public (عمومی)
- protected (محافظت شده)
- 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 تعریف کرده باشید.