
توی دوره رایگان PHP، هر چیزی که برای حرفهای شدن نیاز داری رو یاد میگیری! از مفاهیم پایه تا پیشرفته، همراه با یه پروژه واقعی برای ساخت یه سایت مثل آپارات.
مشاهده بیشتر
توی این دوره با هم یه وبسایت خبری واقعی رو از صفر میسازیم! از طراحی دیتابیس و احراز هویت تا ساخت API و یه پنل مدیریت حرفهای، همه رو یاد میگیریم و آماده پروژههای واقعی میشی!
مشاهده بیشترمشخصات مقاله
Access modifier – مقایسه ی public با private
آموزش استفاده از تنظیم کنندگان سطح دسترسی / Access modifier – مقایسه ی public با private
همان طور که در آموزش های قبلی مشاهده کردید، در کد خود از کلیدواژه ی public به وفور استفاده کرده اما دلیل آن را شرح ندادیم. این کلیدواژه از جمله تنظیم کنندگان سطح دسترسی است که می توانیم در کد شی گرا php خود از آن استفاده کنیم. در مبحث حاضر به شرح تنظیم کننده ی سطح دسترسی private می پردازیم.
همان طور که از اسم آن پیدا است، کلیدواژه ی public این امکان را فراهم می کند تا از داخل و بیرون کلاس (حوزه ی دسترسی کلاس) به اعضای آن دسترسی داشته باشید. سطح دسترسی private، برخلاف public، به کد خارج از محدوده ی کلاس اجازه ی دسترسی به اعضای داخلی خود را نمی دهد.
آنچه خواهید آموخت:
- چگونگی استفاده از تنظیم کننده ی سطح دسترسی public را خواهید آموخت.
- چگونگی استفاده از تنظیم کننده ی سطح دسترسی private را خواهید آموخت.
- چگونگی دسترسی به property که با سطح دسترسی private تعریف شده را خواهید آموخت.
- علت استفاده از access modifier ها در کپسوله سازی را خواهید آموخت.
آموزش استفاده از تنظیم کننده ی سطح دسترسی public
مثال زیر را قبلا نیز مشاهده کرده اید. در مثال جاری، property و متد کلاس مورد نظر با کلیدواژه ی public اعلان شده اند، به همین جهت کد خارج از محدوده ی کلاس نیز امکان فراخوانی اعضای این کلاس و تعامل مستقیم با آن ها را دارند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <!--?php class Car { // public methods and properties. public $model ; public function getModel() { return "The car model is " . $this ---> 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(); <button></button> |
خروجی:
1 2 | The car model is Mercedes <button></button> |
شرح تنظیم کننده ی سطح دسترسی (access modifier) private
حال اگر متدها و متغیرهای داخل کلاس را با کلیدواژه ی private نشانه گذاری کنیم، کد خارج از کلاس دیگر قابلیت دسترسی به اعضای این کلاس را نخواهد داشت. در مثال زیر، متغیر عضو کلاس $model را به صورت private تعریف می کنیم. سپس همان طور که خواهید دید، زمانی که کد خارج از کلاس سعی می کند مقدار آن را فراخوانی کند، خطای مهلک در برنامه رخ می دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <!--?php class Car { //private private $model ; public function getModel() { return "The car model is " . $this ---> model; } } $mercedes = new Car(); // We try to access a private property from outside the class. $mercedes -> model = "Mercedes benz" ; echo $mercedes -> getModel(); ?> <button></button> |
خروجی:
1 | Fatal error: Cannot access private property Car:: $model <button></button> |
چگونگی دسترسی به property که با تنظیم کننده ی سطح دسترسی private تعریف شده از بیرون کلاس
همان طور که در مثال قبلی مشاهده کردید، امکان دسترسی به متغیر private از بیرون کلاس وجود نداشته و سبب رخداد خطای مهلک در برنامه می شود. با این وجود گاهی لازم می شود که از بیرون یک کلاس به property تعریف شده با کلیدواژه ی private دسترسی پیدا کرده و آن را مقداردهی کرد. به منظور تعامل با property های خصوصی و کپسوله سازی شده ی یک کلاس، توسعه دهنده می تواند از متدهای public استفاده کنند چرا که متد public قادر است هم با کد محصور در بدنه ی کلاس و هم با کد تعریف شده بیرون از کلاس میزبان خود، تعامل کند.
متدهای public ای که قادرند به کدهای داخل و بیرون کلاس دسترسی داشته و با آن ها تعامل کنند، به دو دسته تقسیم می شوند:
- توابع setter که property های private را مقداردهی می کنند.
- توابع getter که قادر هستند مقدار property های خصوصی را خوانده و بازیابی کنند.
در مثال زیر، خواهید دید چگونه مقدار property ای به نام $carModel تعریف شده با سطح دسترسی private را خوانده (get) و سپس آن را مقداردهی (set) می کنیم. با فراخوانی متد setModel() متغیر model را مقداردهی کرده و با فراخوانی متد getModel() مقدار property مزبور را می خوانیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <!--?php class Car { //the private access modifier denies access to the method from outside the class’s scope private $model; //the public access modifier allows the access to the method from outside the class public function setModel($model) { $this ---> 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(); ?> < button ></ button > |
خروجی:
1 | The car model is Mercedes benz< button ></ button > |
چرا باید از access modifier استفاده کرد؟
در شرح علت استفاده از access modifier باید گفت که توسعه دهنده می تواند به وسیله ی آن ویرایش هایی که کد خارج از کلاس می تواند بر روی اعضای داخل کلاس (متدها و property) اعمال کند را به راحتی محدود نماید. پس از اینکه property یا متد دلخواه را با استفاده از سطح دسترسی private به صورت خصوصی و محدود به کلاس میزبان تعریف کردیم، آنگاه منحصرا متدهای تعریف شده در بدنه ی همان کلاس اجازه ی دسترسی و اعمال تغییر بر روی آن عضو مخصوص را دارند. بنابراین جهت تعامل با متدها و property های private، لازم است متدها داخل کلاس به صورت public تعریف شده باشند. داخل متدهای مزبور، می توان منطقی قرار داد که علاوه بر محدود سازی داده های تزریق شده به کلاس از بیرون، آن ها را اعتبارسنجی (validate) کرد.
در مثال جاری، می توان با تعریف دقیق مدل هایی که امکان تزریق از بیرون به کلاس و قرار داده شدن در متغیر $model را دارند مشخص کرده و در واقع داده هایی که از کد خارج از کلاس وارد می شوند را اعتبارسنجی و فیلتر کرد. برای این منظور، داخل بدنه ی متد setModel() آرایه ای از مدل های مجاز ماشین را تعیین کرده و اطمینان حاصل می کنیم که تنها این مدل ها قابلیت ذخیره در $model را دارند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <!--?php class Car { //the private access modifier denies access to the method from outside the class’s scope private $model; //the public access modifier allows the access to the method from outside the class public function setModel($model) { //validate that only certain car models are assigned to the $carModel property $allowedModels = array("Mercedes benz","BMW"); if(in_array($model,$allowedModels)) { $this ---> 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(); ?> < button ></ button > |