آموزش رایگان PHP

آموزش جامع سطح دسترسی (Access Modifiers): تفاوت public، private و protected

1405/07/28 22:15 محراب حسن زاده
آموزش جامع سطح دسترسی (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، پیشنهاد می‌شود همواره:

  1. اصل حداقل دسترسی: سطح دسترسی ویژگی‌ها را در محدودترین حالت ممکن (ترجیحاً private) قرار دهید، مگر اینکه دلیل محکمی برای ارتقا به protected یا public داشته باشید.
  2. استفاده از متدهای واسط: برای تغییر مقادیر کلاس به جای قرار دادن متغیر به صورت public، از متدهای Setter استفاده کنید تا بتوانید اعتبارسنجی ورودی‌ها را به درستی انجام دهید.
  3. سازگاری در ارث‌بری: توجه داشته باشید که متدهای اورراید شده (Override) در کلاس‌های فرزند نمی‌توانند سطح دسترسی محدودتری نسبت به کلاس والد داشته باشند.

پیشنمایش

پرسش و پاسخ

نظری یافت نشد

مطالب مشابه

آموزش ارث‌بری (Inheritance) در جاوا اسکریپت: نحوه استفاده از پروتوتایپ‌ها و کلاس‌ها
1403/07/28 21:20

آموزش ارث‌بری (Inheritance) در جاوا اسکریپت: نحوه استفاده از پروتوتایپ‌ها و کلاس‌ها

مطالعه بیشتر
آموزش کامل ثابت‌ها در PHP: تفاوت عمیق define و const طبق استانداردهای گوگل
1405/03/24 01:10

آموزش کامل ثابت‌ها در PHP: تفاوت عمیق define و const طبق استانداردهای گوگل

مطالعه بیشتر
آموزش کامل ساخت فرم در HTML: از المان‌ها تا نکات سئو
1402/05/21 23:48

آموزش کامل ساخت فرم در HTML: از المان‌ها تا نکات سئو

مطالعه بیشتر
آموزش کامل دستور switch-case در PHP (به همراه مثال‌های کاربردی)
1405/04/04 00:08

آموزش کامل دستور switch-case در PHP (به همراه مثال‌های کاربردی)

مطالعه بیشتر
آموزش کار با flex-grow، flex-shrink و flex-basis در CSS Flexbox: مدیریت اندازه و فضای عناصر
1403/08/11 20:50

آموزش کار با flex-grow، flex-shrink و flex-basis در CSS Flexbox: مدیریت اندازه و فضای عناصر

مطالعه بیشتر
مدیریت فرم‌ها و ورودی‌ها در Vue.js | آموزش Form Handling با مثال کاربردی
1404/09/22 00:40

مدیریت فرم‌ها و ورودی‌ها در Vue.js | آموزش Form Handling با مثال کاربردی

مطالعه بیشتر
آموزش کامل کار با fopen، سطوح دسترسی و حذف فایل در PHP
1405/05/04 23:28

آموزش کامل کار با fopen، سطوح دسترسی و حذف فایل در PHP

مطالعه بیشتر
آموزش CSS Transform و Transition: تبدیل‌ها و ایجاد تغییرات ظاهری پویا
1402/06/10 18:32

آموزش CSS Transform و Transition: تبدیل‌ها و ایجاد تغییرات ظاهری پویا

مطالعه بیشتر
آموزش گام به گام ساخت سیستم لاگین و لاگ‌اوت در PHP به صورت ایمن
1405/05/14 22:13

آموزش گام به گام ساخت سیستم لاگین و لاگ‌اوت در PHP به صورت ایمن

مطالعه بیشتر
معرفی Vue.js و ویژگی‌های کلیدی آن: فریمورک مدرن برای توسعه وب تعاملی
1402/06/28 00:33

معرفی Vue.js و ویژگی‌های کلیدی آن: فریمورک مدرن برای توسعه وب تعاملی

مطالعه بیشتر
آموزش Responsive Design با استفاده از Media Queries: طراحی واکنش‌گرا برای تمامی دستگاه‌ها
1402/06/10 18:07

آموزش Responsive Design با استفاده از Media Queries: طراحی واکنش‌گرا برای تمامی دستگاه‌ها

مطالعه بیشتر
استفاده از font face در CSS برای اضافه کردن فونت‌های سفارشی: راهنمای کامل
1403/08/16 21:48

استفاده از font face در CSS برای اضافه کردن فونت‌های سفارشی: راهنمای کامل

مطالعه بیشتر

تمامی حقوق معتلق به ناشر سایت است و کپی از آن پیگرد قانونی دارد