عنوان مقاله :

کپسوله سازی - برنامه نویسی شی گرا در php | قسمت سوم

گردآوری و تالیف : حسام موسوی
تاریخ انتشار : 30 شهریور 1394
دسته بندی ها : برنامه نویسی

با سلام خدمت دوستان و کاربران عزیز وبسایت راکت در قسمت های قبل یعنی

در مورد مفهوم برنامه نویسی شی گرا در php و همینطور در مورد property ها و method ها صحبت کردیم و با مثال های مختلف اونا رو بهتون یاد دادیم حالا در این جلسه قصد دارم در مورد Encapsulation (کپسوله سازی) صحبت کنم و اونو بهتون آموزش بدم امیدوارم مورد استفاده اتون قرار بگیره . 

Encapsulation (کپسوله سازی)

اولین باری که این اسم رو میبینید تعجب میکنید که این دیگه چیه . یعنی قراره چی باشه ! راستش خودمم همینطور بودم ، برام عجیب بود ولی وقتی معنی کسپوله سازی رو بفهمید دیگه براتون ساده میشه . همونطوری که برای من ساده شد. کپسوله سازی همون پنهان سازی اطلاعاته اما ما چرا باید اطلاعاتی رو پنهان سازی کنیم . در جلسه قبل اگه یادتون باشه من دوتا method درست کردم به اسم های set و get که هر کدوم کار خودشون رو انجام می دادن یعنی یکی مقداردهی property مون رو انجام میداد و یکی مقدار property رو برامون بر میگردوند اما چرا باید اینطوری باشه . این سوالیه که منم داشتم چون ما به راحتی میتونیم از خود property استفاده کنیم و مقداردهی و چاپش کنیم اما این درست نیست . گاهی property ها و method های حساسی وجود داره که قابل استفاده در object ها نیستن ! چرا نیستن ؟ چون پنهان سازی شدن . اگه یادتون باشه در جلسه قبلی سه کلمه کلیدی public , private و protected رو معرفی کردم اما فقط از public استفاده کردم و گفتم تو این جلسه میگم اینا به چه کاری میان بزارین با تعریف کردن هر کدوم اینا به نتیجه برسیم . 

protected  : اگر property یا method ای قبلش از این کلمه استفاده بشه به این معنیه که شما از اون property و method  فقط در کلاس ها میتونید استفاده کنید و اصلا نمی تونید در object ای که میسازید مورد استفاده قرارش بدید . [ البته با روش های خاص میشه ]

private : اگر property یا method ای قبلش از این کلمه استفاده بشه به این معنیه که شما از اون property و method فقط و فقط میتونید در داخل همون کلاس استفاده کنید و پس یعنی قابلیت استفاده در object رو هم ندارید . private شبیه protected  اما استفاده نشدن در کلاس های دیگه بین اونا فرق میزاره . 

و در نهایت public : اگر property یا method ای قبلش از این کلمه استفاده بشه به این معنیه که شما از اون property و method به راحتی می تونید در کلاس ها و object ها استفاده کنید . به همین سادگی . 

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

خب حالا فکر کنم باید متوجه شده باشید چرا از method های set و get استفاده کردیم ولی هر موضوعی با مثال واضح تر میشه پس به مثال های زیر دقت کنید تا بیشتر براتون این موضوع جا بیوفته . 

<?php

class MyClass
{
  public $name = 'John Doe';
}

$obj = new MyClass;

echo $obj->name . '</br >';

$obj->name = 'Hesam Mousavi';

echo $obj->name ;

?>

این همون مثال جلسه قبلیه در این مثال property ما از نوع public برای همین با ساخت object به راحتی می تونید از خود object هم عمل مقدار دهی دوباره و هم مقدار فعلیش رو برگشت بدید . حالا به مثال زیر هم دقت کنید .

<?php

class MyClass
{
  protected $name = 'John Doe';
}

$obj = new MyClass;

echo $obj->name;

?>

در بالا property ما از نوع protected برای همین در object نه میتونید مقدار دهی کنید و نه میتونید مقدار فعلی رو بر گردونید در واقع اگه کد بالا رو اجرا کنید بهتون ارور میده . 

اما در مثال زیر با استفاده از متدهای get و set به راحتی یک property ای که از نوع protected باشه رو مقدار دهی یا مقدار فعلی رو برگشت میدیم . 

<?php
 
class MyClass
{
  protected $name = "John Doe";
 
  public function setProperty($newval)
  {
      $this->name = $newval;
  }
 
  public function getProperty()
  {
      return $this->name . "<br />";
  }
}
 
$obj = new MyClass;
 
echo $obj->getProperty(); // Get the property value
 
$obj->setProperty("Hesam Mousavi"); // Set a new one
 
echo $obj->getProperty(); // Read it out again to show the change
 
?>

حالا میبینید که در کد بالا به راحتی با استفاده از method ها تونیستم عمل مقدار دهی و همینطور برگشت مقدار فعلی یک property از نوع protected رو انجام بدیم . برای کلمه private هم همین وضعیت بالا (protected) برقراره اما یک ویژگی دیگه ای که private داره اینکه در کلاس های دیگه قابل استفاده نیست . 

امیدوارم این بحث هم مورد استفاده اتون قرار گرفته باشه . اگر نظری یا سوالی داشتین در بخش نظرات حتما بیان کنید . جلسه بعدی در مورد ارثیت ( Inheritance ) صحبت میکنم . 

مقالات پیشنهادی

پی اچ پی 7.1 و ویژگی های جدید

تقریبا یک ماه قبل پی اچ پی 7.1 بصورت نهایی ارائه شد و حالا توسعه دهنده ها میتونن از اون در پروژه های خودشون استفاده کنن . در این نسخه جدید ، ویژگی های...

من یک طراح و برنامه نویس وب هستم ولی کاری ندارم

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

برنامه نویسی شی گرا در php | قسمت چهارم

امروز میخوام در مورد یک بحث مهم در شی گرائی صحبت کنم و اونم وارثته . خوب اینجا من گفتم وارثت ، اولین چیزی که بعد از شنیدن وراثت به ذهنتون خطور کرد چی...

برنامه نویسی شی گرا در php | قسمت اول

در گذشته قبل از اینکه مفهومم شی گرایی وارد زبان php بشه برنامه نویس ها مجبور بودن که php رو در کنار html استفاده کنن که این روش در پروژهای کوچیک مشکل...

دیدگاه های ارزشمند شما

ramin | 3 ماه پیش

بسیار عالی و روان توضیح دادید. سپاسگذارم

مهیار | 11 ماه پیش

درود خسته نباشید...

عزیز شما فرمودید نمیشه مقدارش رو بگردوند وقتی که پروتکت شده ولی در مثال اخر اول از همه بعد از ساخت شی اومدید و مقدارش رو برگدوندید...

باعث ارور نمیشه؟

admin | 11 ماه پیش

پیشنهاد میکنم یکبار دیگه با دقت بخونید
زمانی که پروپرتی ای رو از نوع protected مشخص میکنید میتونید فقط از مقدار اون در کلاس خودش و فرزندش استفاده کنید اما نمی تونید از اون در زمان ساخت Object استفاده کنید در مثال آخر من از این پروپرتی در خود کلاس استفاده کردم و متد setter و getter ساختم که با استفاده از اینا میشه به اون پروپرتی و مقدارش دسترسی پیدا کرد اما مستقیما امکانش نیست

hannanstd | 1 سال پیش

سلام.
خیلی ممنون .
ولی من هنوز فرق private با protected رو نفهیمدم .
شما فرمودی که "یک ویژگی دیگه ای که private داره اینکه در کلاس های دیگه قابل استفاده نیست . "
خب مگه protected قابل استفاده هست؟
و یه سوال دیگه .
میشه فرق دو مورد زیر رو بگید :

$obj = new myclass;
$test = $obj->name;

$test = myclass::$name;

admin | 1 سال پیش

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

hannanstd | 1 سال پیش

سلام . ممنون بابت توضیحات کاملتون . اما توی پارت 4 شما یک نکته گفتید که برعکس این چیزی هست که الان اینجا فرمودید . فک کنم توی اون نکته اشتباه تایپی کرده باشید .

نکته : به یاد داشته باشید property ها و method های که از نوع protected باشن قابلیت ارث بری ندارن و نمیشه در کلاس های فرزند از این نوع method ها و property ها استفاده کرد .


در ضمن لطفا در صورت امکان در مورد static ها هم توی پارت های بعدی توضیح بدید .

در کل تشکر بخاطر سایت عالیتون .

admin | 1 سال پیش

بله protected در کلاس های فرزند قابل استفاده است اما private فقط در یک کلاس قابل استفاده است و اینطور در نظر بگیرید که private یک چیز کاملا خصوصی فقط برای یک کلاسه اما protected یک چیز خصوصی برای یک کلاس و کلاس های فرزنده .

در مورد سوال دوم باید بگم
این
$obj = new myclass;
$test = $obj->name;
ساخت یک شی از کلاسه که خط دوم مقدار name رو داخل test میریزین
اما
این
$test = myclass::$name;
شما مستقیما مقدار یک متد static از کلاس myclass رو داخل test میریزین این حالت تنها زمانی اتفاق میفته که متد شما از نوع static باشه .
http://php.net/manual/en/language.oop5.static.php

jahan | 1 سال پیش

خیلی ممنونم
بسیار خوب بود.
منتظر ویدیوهای آموزشیتون هستیم...

علی یوسفی | 2 سال پیش

واقعا ممنون خیلی ساده و روان توضیح میدین و با مثال های خیلی خوب

admin | 2 سال پیش

بله ، دوره oop هم برگزار میشه تا دوستان بهتر بتونن بصورت عملی مبحت oop رو یاد بگیرن .

علی یوسفی | 2 سال پیش

100 درصد همینطوره. سری ویدیویی هم قرار میدین ؟ چون من دوره ویدیویی شی گرائی فارسی با کیفیتی را ندیدم البته درست هست که شی گرایی مبحث تئوریک هستش اما به نظرم باید قسمت کد نویسیش را هم یاد گرفت

admin | 2 سال پیش

خواهش میکنم
امیدوارم از قسمت های بعدی که قرار میدیم هم راضی باشین .