سطوح دسترسی یا access level در php
در قسمت های قبل مفصلا درباره کلاس ها در php صحبت کردیم و در قسمت ارث بری به نحوه عملکرد اعضای کلاس والد (parent) و فرزند اشاره کردیم.
نکات تکمیلی برای دو قسمت ذکر شده، سطوح دسترسی یا access level می باشد. یعنی هر عضو کلاس (یک متغیر یا یک تابع) دارای سطح دسترسی می باشد که مشخص میکند در کجا ها قابل استفاده است و در کجا ها امکان دسترسی به آنها وجود ندارد.
در زبان برنامه نویسی php ما سه سطح دسترسی داریم:
- private یا خصوصی
- protected یا محافظت شده
- public یا عمومی
class MyClass {
private $private_var;
public $public_var;
protected $protected_var;
}
در ادامه به بررسی دقیقتر هریک از این سطوح خواهیم پرداخت.
سطح دسترسی private در php
کلاسی به نام A را در نظر میگیریم. تمامی عضو های private کلاس A، فقط و فقط در داخل کلاس A قابل دسترس میباشد. این تنها جایی است که یک عضو private قابل دسترس است. مثال زیر را ببینید.
class A {
private $name = "it3du";
}
$obj = new A();
echo $obj->name;
// Fatal error: Uncaught Error: Cannot access private property A::$name in myfile/address/test.php
همانطور که در خط آخر به صورت کامنت نشان داده ایم، دسترسی مستقیم به متغیر name با خطا مواجه خواهد شد. دلیل این موضوع داشتن سطح دسترسی private برای متغیر name است. بنابراین دسترسی مستقیم به اعضا private کلاس، چه متغیر چه تابع، امکان پذیر نمیباشد.
اما همانطور که گفتیم دسترسی اعضای private در داخل کلاسی که تعریف شده اند امکان پذیر است. مثال زیر این موضوع را نشان میدهد.
class A {
private $name = "it3du";
function get_name() {
return $this->name;
}
}
$obj = new A();
echo $obj->get_name(); // output: it3du
در مثال بالا متد get_name به تمامی اعضای کلاس خودش دسترسی دارد و مقدار متغیر name را بر میگرداند.
برای متد ها در کلاس، نیازی به تعریف سطح دسترسی برای آن وجود ندارد. چون به صورت پیش فرض متد های تعریف شده در یک کلاس سطح دسترسی public دارند، مگر آنکه سطح دسترسی دیگری برای آنها تعیین شود
در ادامه آموزش php و قسمت های آتی درباره دسترسی به متغیر های private کلاس با استفاده از setter و getter خواهیم پرداخت.
سطح دسترسی protected
این سطوح در شی گرایی و وراثت مورد استفاده قرار میگیرد. از کلاس فرزند میتوان به فیلد های protected کلاس پدر دسترسی داشت. به عبارت دیگر، تمامی فیلد های کلاس پدر که از نوع protected هستند، فقط می توانند در کلاس فرزند قابل دسترس باشند.
دسترسی مستقیم به فیلد های protected با استفاده از نمونه آن کلاس، امکان پذیر نمیباشد
در مثال زیر کلاس A کلاس پدر و کلاس B کلاس فرزند است.
class A {
protected $name = "it3du";
}
class B extends A {
function get_name() {
return $this->name;
}
}
$obj = new B();
echo $obj->get_name(); // output: it3du
همانطور که گفتیم فیلد name در کلاس A چون از نوع protected است بنابراین با نمونه ایجاد شده از کلاس A به صورت مستقیم قابل دسترس نمیباشد. مثال زیر این موضوع را نشان میدهد.
class A {
protected $name = "it3du";
}
$a = new A();
echo $a->name;
// PHP Fatal error: Uncaught Error: Cannot access protected property A::$name
کامنت انتهایی کد، به صورت واضح اشاره کرده است که دسترسی به فیلد protected امکانپذیر نمیباشد.
سطح دسترسی public
اعضای public یا عمومی دارای سطح دسترسی نامحدود هستند. در واقع یک عضو public علاوه بر جاهایی که امکان دسترسی به یک عضو private وجود دارد از طریق یک آبجکت هم قابل دسترس است. مثال زیر را ببینید.
class A {
public $public_var = 'public variable';
private $private_var = 'private variable';
protected $protected_var = "protected_variable";
}
$obj = new A();
echo $obj->public_var; // دسترسی مجاز
// PHP Fatal error: Uncaught Error: Cannot access private property A::$private_var
echo $obj->private_var; // دسترسی غیر مجاز
//PHP Fatal error: Uncaught Error: Cannot access protected property A::$protected_var
echo $obj->protected_var; // دسترسی غیر مجاز
کلمه کلیدی var در php
قبل از PHP نسخه 5 کلمه کلیدی var برای اعلان فیلد ها به کار میرفت. این کلمه هنوز هم قابل استفاده است و مانند public سطح دسترسی عمومی به فیلد ها میدهد. پیشنهاد میشود از public به جای var استفاده شود. با این حال مثالی درباره استفاده var را در زیر مشاهده میکنید.
class A {
// این روش پیشنهاد میشود
public $public_var = 'public variable';
// نامطلوب
var $my_var = 'var keyword';
}
نکاتی درباره سطح دسترسی
از آنجایی که نحوه و سبک برنامه نویسی برای ساخت یک برنامه میتواند متفاوت باشد و در حین ساخت برنامه میتوانید از الگو های مختلفی استفاده کنید، پیشنهاد میشود برای جلوگیری از خطا و استفاده صحیح از سطوح دسترسی در کلاس ها، محدودترین سطوح دسترسی استفاده شود.
استفاده صحیح و بجا از سطوح دسترسی باعث ساخت کلاس هایی با قابلیت اطمینان بالا، جلوگیری از دسترسی نادرست و ناخواسته و همچنین اشکال زدایی راحت تر برنامه خواهد شد.