دسته بندی :
تاریخ انتشار : ۳۰ شهریور ۱۳۹۴
گردآوری و تالیف : حسام موسوی

کارمو با طراحی گرافیکی شروع کردم و حدود 2 سال طراحی گرافیکی میکردم بعد به طراحی وب علاقه پیدا کردم و همراه طراحی وب عاشق کدنویسی شدم به PHP | sass | css | Jquery | javaScript تسلط کامل دارم . در بین فریم ورک های PHP اول با CodeIgniter کار کردم اما به laravel علاقه مند شدم و دارم بطور حرفه ای دنبالش میکنم . امید من اینکه بتونم کاربرهای ایرانی رو به دنیای بیرون متصل کنم تا بتونن از فناوری های تازه آگاهی داشته باشن

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

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

دیدگاه های مخاطبین

ثبت دیدگاه شما
  • مهیار

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

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

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

    • admin

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

  • hannanstd

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

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

    $test = myclass::$name;

    • admin

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

    • hannanstd

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

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


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

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

    • admin

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

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

  • علی یوسفی

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

    • admin

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

    • علی یوسفی

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

    • admin

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

پیشنهاد میکنیم این مطالب رو هم مطالعه کنید :