آموزش Access modifier در PHP


آموزش استفاده از تنظیم کنندگان سطح دسترسی / Access modifier – مقایسه ی public با private

همان طور که در آموزش های قبلی مشاهده کردید، در کد خود از کلیدواژه ی public به وفور استفاده کرده اما دلیل آن را شرح ندادیم. این کلیدواژه از جمله تنظیم کنندگان سطح دسترسی است که می توانیم در کد شی گرا php خود از آن استفاده کنیم. در مبحث حاضر به شرح تنظیم کننده ی سطح دسترسی private می پردازیم.

همان طور که از اسم آن پیدا است، کلیدواژه ی public این امکان را فراهم می کند تا از داخل و بیرون کلاس (حوزه ی دسترسی کلاس) به اعضای آن دسترسی داشته باشید. سطح دسترسی private، برخلاف public، به کد خارج از محدوده ی کلاس اجازه ی دسترسی به اعضای داخلی خود را نمی دهد.

آنچه خواهید آموخت:

  • چگونگی استفاده از تنظیم کننده ی سطح دسترسی public را خواهید آموخت.
  • چگونگی استفاده از تنظیم کننده ی سطح دسترسی private را خواهید آموخت.
  • چگونگی دسترسی به property که با سطح دسترسی private تعریف شده را خواهید آموخت.
  • علت استفاده از access modifier ها در کپسوله سازی را خواهید آموخت.

آموزش استفاده از تنظیم کننده ی سطح دسترسی public

مثال زیر را قبلا نیز مشاهده کرده اید. در مثال جاری، property و متد کلاس مورد نظر با کلیدواژه ی public اعلان شده اند، به همین جهت کد خارج از محدوده ی کلاس نیز امکان فراخوانی اعضای این کلاس و تعامل مستقیم با آن ها را دارند.

   model;    }  }  $mercedes = new Car();  //Here we access a property from outside the class  $mercedes -> model = "Mercedes";  //Here we access a method from outside the class  echo $mercedes -> getModel();  

خروجی:

                          The car model is Mercedes  

شرح تنظیم کننده ی سطح دسترسی (access modifier) private

حال اگر متدها و متغیرهای داخل کلاس را با کلیدواژه ی private نشانه گذاری کنیم، کد خارج از کلاس دیگر قابلیت دسترسی به اعضای این کلاس را نخواهد داشت. در مثال زیر، متغیر عضو کلاس $model را به صورت private تعریف می کنیم. سپس همان طور که خواهید دید، زمانی که کد خارج از کلاس سعی می کند مقدار آن را فراخوانی کند، خطای مهلک در برنامه رخ می دهد.

 model;    }  }  $mercedes = new Car();  // We try to access a private property from outside the class.  $mercedes -> model = "Mercedes benz";  echo $mercedes -> getModel();  ?>  

خروجی:

Fatal error: Cannot access private property Car::$model

چگونگی دسترسی به property که با تنظیم کننده ی سطح دسترسی private تعریف شده از بیرون کلاس

همان طور که در مثال قبلی مشاهده کردید، امکان دسترسی به متغیر private از بیرون کلاس وجود نداشته و سبب رخداد خطای مهلک در برنامه می شود. با این وجود گاهی لازم می شود که از بیرون یک کلاس به property تعریف شده با کلیدواژه ی private دسترسی پیدا کرده و آن را مقداردهی کرد. به منظور تعامل با property های خصوصی و کپسوله سازی شده ی یک کلاس، توسعه دهنده می تواند از متدهای public استفاده کنند چرا که متد public قادر است هم با کد محصور در بدنه ی کلاس و هم با کد تعریف شده بیرون از کلاس میزبان خود، تعامل کند.

متدهای public ای که قادرند به کدهای داخل و بیرون کلاس دسترسی داشته و با آن ها تعامل کنند، به دو دسته تقسیم می شوند:

  1. توابع setter که property های private را مقداردهی می کنند.
  2. توابع getter که قادر هستند مقدار property های خصوصی را خوانده و بازیابی کنند.

در مثال زیر، خواهید دید چگونه مقدار property ای به نام $carModel تعریف شده با سطح دسترسی private را خوانده (get) و سپس آن را مقداردهی (set) می کنیم. با فراخوانی متد setModel() متغیر model را مقداردهی کرده و با فراخوانی متد getModel() مقدار property مزبور را می خوانیم.

   model = $model;    }    public function getModel()    {      return "The car model is  " . $this -> model;    }  }  $mercedes = new Car();  //Sets the car’s model  $mercedes -> setModel("Mercedes benz");  //Gets the car’s model  echo $mercedes -> getModel();  ?>  

خروجی:

The car model is Mercedes benz

چرا باید از access modifier استفاده کرد؟

در شرح علت استفاده از access modifier باید گفت که توسعه دهنده می تواند به وسیله ی آن ویرایش هایی که کد خارج از کلاس می تواند بر روی اعضای داخل کلاس (متدها و property) اعمال کند را به راحتی محدود نماید. پس از اینکه property یا متد دلخواه را با استفاده از سطح دسترسی private به صورت خصوصی و محدود به کلاس میزبان تعریف کردیم، آنگاه منحصرا متدهای تعریف شده در بدنه ی همان کلاس اجازه ی دسترسی و اعمال تغییر بر روی آن عضو مخصوص را دارند. بنابراین جهت تعامل با متدها و property های private، لازم است متدها داخل کلاس به صورت public تعریف شده باشند. داخل متدهای مزبور، می توان منطقی قرار داد که علاوه بر محدود سازی داده های تزریق شده به کلاس از بیرون، آن ها را اعتبارسنجی (validate) کرد.

در مثال جاری، می توان با تعریف دقیق مدل هایی که امکان تزریق از بیرون به کلاس و قرار داده شدن در متغیر $model را دارند مشخص کرده و در واقع داده هایی که از کد خارج از کلاس وارد می شوند را اعتبارسنجی و فیلتر کرد. برای این منظور، داخل بدنه ی متد setModel() آرایه ای از مدل های مجاز ماشین را تعیین کرده و اطمینان حاصل می کنیم که تنها این مدل ها قابلیت ذخیره در $model را دارند.

 model = $model;      }      else      {        $this -> model = "not in our list of models.";      }    }    public function getModel()    {      return "The car model is  " . $this -> model;    }  }  $mercedes = new Car();  //Sets the car’s model  $mercedes -> setModel("Mercedes benz");  //Gets the car’s model  echo $mercedes -> getModel();  ?>   

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *