عنوان مقاله :

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

گردآوری و تالیف : حسام موسوی
تاریخ انتشار : 29 شهریور 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 ) صحبت میکنم . 

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

8 ابزار جالب برای طراحی وب

بهترین ابزارهای جالبی که برای طراحان وب وجود داره, پروژه های CodePen هستند. که یک IDE ساخته شده توسط تیم CodePen هست. یک راه ساده برای کار روی پروژه ه...

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

خب امروز در این پست رسیدیم به متدهایی جادوئی در شی گرایی php . در php برای ساده تر کردن بعضی از کارها در کلاس ها یک سری متدهای خاص و ویژه در شی گرایی...

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

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

PHP یا PYTHON - کدام یک پیروز میدان است؟

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

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

ramin | 7 ماه پیش

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

مهیار | 1 سال پیش

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

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

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

admin | 1 سال پیش

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

hannanstd | 2 سال پیش

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

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

$test = myclass::$name;

admin | 2 سال پیش

بله 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

hannanstd | 2 سال پیش

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

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


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

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

admin | 2 سال پیش

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

jahan | 2 سال پیش

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

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

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

admin | 2 سال پیش

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

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

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

admin | 2 سال پیش

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