آموزش جامع سطح دسترسی (Access Modifiers): تفاوت public، private و protected
مقدمه؛ چرا به مشخصکنندههای سطح دسترسی نیاز داریم؟
در دنیای برنامه نویسی شیءگرا (OOP)، یکی از اصول پایهای و حیاتی، کپسولهسازی (Encapsulation) است. کپسولهسازی به این معناست که دادهها و متدهای مربوط به یک کلاس را در یک کپسول واحد قرار دهیم و از دسترسیهای ناخواسته یا مخرب خارجی به آنها جلوگیری کنیم. مشخصکنندههای سطح دسترسی یا همان Access Modifiers ابزارهایی هستند که این کنترل را برای ما فراهم میکنند.
بدون وجود این سطوح دسترسی، هر بخش از برنامه میتواند وضعیت داخلی شیء را تغییر دهد که این امر منجر به کدهای کثیف، خطاهای پیشبینی نشده و باگهای امنیتی بزرگ میشود.
معرفی ۳ سطح دسترسی اصلی
در اکثر زبانهای شیءگرا مانند PHP، Java، C++ و C#، سه کلمه کلیدی برای تعیین سطح دسترسی وجود دارد:
- Public (عمومی): آزادترین حالت ممکن. همه چیز برای همه جا در دسترس است.
- Private (خصوصی): محدودترین حالت ممکن. دسترسی فقط در داخل خود کلاس امکانپذیر است.
- Protected (محافظتشده): حالتی میانه. دسترسی از داخل کلاس و کلاسهای ارثبری شده (فرزند) ممکن است.
۱. سطح دسترسی Public (عمومی)
هرگاه ویژگی (Property) یا متدی (Method) را به صورت public تعریف کنید، هیچ محدودیتی برای دسترسی به آن وجود ندارد. کدهای خارج از کلاس، شیءهای ساخته شده و کلاسهای فرزند به راحتی میتوانند آن را بخوانند یا تغییر دهند.
مثال کاربردی از Public در PHP:
class User {
public $username;
public function sayHello() {
return "سلام " . $this->username;
}
}
$user = new User();
$user->username = "Ali"; // دسترسی مستقیم از خارج کلاس مجاز است
echo $user->sayHello();
۲. سطح دسترسی Private (خصوصی)
اگر ویژگی یا متدی را private تعریف کنید، فقط و فقط کدهای داخل خود همان کلاس اجازه تعامل با آن را دارند. حتی کلاسهایی که از این کلاس ارثبری میکنند (کلاسهای فرزند) نیز به این اعضا دسترسی نخواهند داشت.
چرا از Private استفاده کنیم؟ برای جلوگیری از تغییر ناگهانی متغیرهای حساس. برای دسترسی به این متغیرها معمولاً از متدهای عمومی به نام Getter و Setter استفاده میشود.
مثال کاربردی از Private به همراه Getter و Setter:
class BankAccount {
private $balance = 0;
// متد عمومی برای واریز پول با بررسی شرایط امنیتی
public function deposit($amount) {
if ($amount > 0) {
$this->balance += $amount;
}
}
// متد عمومی برای خواندن موجودی (Getter)
public function getBalance() {
return $this->balance;
}
}
$account = new BankAccount();
// $account->balance = 5000; // خطا! دسترسی مستقیم غیرمجاز است
$account->deposit(1500); // روش صحیح
echo $account->getBalance(); // خروجی: 1500
۳. سطح دسترسی Protected (محافظت شده)
سطح دسترسی protected زمانی کاربرد دارد که بخواهید متغیر یا متدی در کلاسهای فرزند (که از کلاس فعلی ارثبری کردهاند) در دسترس باشد، اما کدهای خارج از کلاس کماکان حق دسترسی و تغییر مستقیم آن را نداشته باشند.
مثال کاربردی از Protected در ارثبری:
class Employee {
protected $salary;
public function __construct($salary) {
$this->salary = $salary;
}
}
class Manager extends Employee {
public function getBonus() {
// دسترسی به متغیر protected کلاس والد در کلاس فرزند مجاز است
return $this->salary * 0.2;
}
}
$manager = new Manager(5000);
// echo $manager->salary; // خطا! دسترسی از خارج کلاس مجاز نیست
echo $manager->getBonus(); // خروجی: 1000
جدول مقایسه نهایی سطوح دسترسی
برای درک سریعتر و بهتر، جدول زیر تفاوتهای این سه سطح دسترسی را نشان میدهد:
| مکان دسترسی | Public | Protected | Private |
|---|---|---|---|
| داخل خود کلاس تعریفکننده | ✔ بله | ✔ بله | ✔ بله |
| داخل کلاسهای فرزند (ارثبری) | ✔ بله | ✔ بله | ❌ خیر |
| خارج از کلاس (شیء ساختهشده) | ✔ بله | ❌ خیر | ❌ خیر |
بهترین شیوهها (Best Practices) طبق استانداردهای گوگل
بر اساس راهنماهای سبک کدنویسی گوگل و اصول Clean Code، پیشنهاد میشود همواره:
- اصل حداقل دسترسی: سطح دسترسی ویژگیها را در محدودترین حالت ممکن (ترجیحاً
private) قرار دهید، مگر اینکه دلیل محکمی برای ارتقا بهprotectedیاpublicداشته باشید. - استفاده از متدهای واسط: برای تغییر مقادیر کلاس به جای قرار دادن متغیر به صورت public، از متدهای Setter استفاده کنید تا بتوانید اعتبارسنجی ورودیها را به درستی انجام دهید.
- سازگاری در ارثبری: توجه داشته باشید که متدهای اورراید شده (Override) در کلاسهای فرزند نمیتوانند سطح دسترسی محدودتری نسبت به کلاس والد داشته باشند.
پرسش و پاسخ
نظری یافت نشد
برای ارسال نظر ابتدا وارد شوید