آشنایی با مفهوم Access Modifier در زبان PHP


تا این مرحله از دورهٔ آموزش OOP در PHP بارها و بارها با کیورد public برخورد داشته‌ایم که این کلیدواژه در کنار کلیدواژگان protected و private تحت عنوان Access Modifier شناخته می‌شوند. به عبارتی، این کلیدواژگان مشخص‌کنندهٔ سطح دسترسی پراپرتی‌ها و متدهای داخل این کلاس هستند. برای آن که به طور عملی با این سطوح دسترسی آشنا شویم، داخل پوشهٔ oop پروژه‌ای تحت عنوان access-modifier ساخته و ساختار پروژه‌های قبلی را داخل آن ایجاد می‌کنیم. در ادامه، داخل پوشهٔ classes فایلی تحت عنوان Visibility.php ساخته و آن را به صورت زیر تکمیل می‌کنیم:

<?php
namespace SokanAcademy;

class Visibility
{
    public $publicProperty = "Public Property";
    protected $protectedProperty = "Protected Property";
    private $privateProperty = "Private Property";

    public function showPublicMethod()
    {
        echo "This is a public method\n";
    }

    protected function showProtectedMethod()
    {
        echo "This is a protected method\n";
    }

    private function showPrivateMethod()
    {
        echo "This is a private method\n";
    }
}

کلاسی هم‌نام با نام این فایل تحت عنوان Visibility ساخته و داخل بدنهٔ آن سه پراپرتی تعریف کرده و به ترتیب سطوح دسترسی protected ،public و private را برای آن‌ها در نظر گرفته‌ایم. در ادامه، سه متد مختلف نیز با سطوح دسترسی protected ،public و private ساخته‌ایم که تنها کاری که قرار است انجام دهند آن است که استرینگی را چاپ کنند. در ادامهٔ این آموزش، ابتدا به معرفی عملکرد این سطوح پرداخته سپس در عمل خواهیم دید که چگونه کار خواهند کرد.

آشنایی با سطح دسترسی public

همان‌طور که از نام این Access Modifier مشخص است، کیورد public یک سطح دسترسی سراسری در اختیار پراپرتی‌ها یا متدهای داخل یک کلاس قرار می‌دهد به طوری که هیچ گونه محدودیتی در دستیابی به آن‌ها از جای‌جای سورس‌کد وجود نخواهد داشت.

آشنایی با سطح دسترسی protected

سطح دسترسی protected به معنای «محافظت‌شده» بوده و حاکی از آن است که پراپرتی‌ها و متدهایی که از جنس protected باشند، فقط و فقط از طریق همان کلاسی که داخلش تعریف‌شده‌اند و همچنین کلاس‌های فرزندی که از آن کلاس ارث‌بری کرده‌اند در دسترس خواهند بود.

آشنایی با سطح دسترسی private

محدودترین سطح دسترسی در این بین private است به طوری که پراپرتی‌ها و متدهایی از این جنس فقط و فقط از طریق همان‌ کلاسی که داخلش تعریف شده‌اند قابل‌استفاده خواهند بود.

حال که با مفهوم تک‌تک سطوح دسترسی آشنا شدیم، جهت تست کلاس Visibility که پیش از اقدام به ساختش کردیم، وارد فایل index.php شده و کدهای زیر را داخل آن می‌نویسیم:

<?php
ini_set('display_errors', '1');
require_once 'vendor/autoload.php';

$obj = new SokanAcademy\Visibility();
echo $obj->publicProperty;
echo "\n";
echo $obj->protectedProperty;
echo "/n";
echo $obj->privateProperty;

ابتدا از روی کلاس Visibility آبجکتی تحت عنوان obj$ ساخته سپس هر سه پراپرتی را به این آبجکت منتسب کرده تا با استفاده از دستور echo مقادیر آن‌ها را چاپ کنیم. چنانچه این فایل را از طریق کامندلاین و یا مرورگر اجرا کنیم، در خروجی خواهیم داشت:

/var/www/oop/access-modifier$ php index.php 
Public Property
PHP Fatal error: Uncaught Error: Cannot access protected property SokanAcademy\Visibility::$protectedProperty in /var/www/oop/access-modifier/index.php:8
Stack trace:
#0 {main}
  thrown in /var/www/oop/5-access-modifier/index.php on line 8

همان‌طور که در خروجی ملاحظه می‌شود، مقدار پراپرتی publicProperty$ که از جنس public می‌باشد به درستی چاپ شده است اما دو پراپرتی دیگر که از جنس protected و private هستند منجر به بروز ارور شده‌اند و این ارور حاکی از آن است که امکان دسترسی به پراپرتی protectedProperty$ را نخواهیم داشت. با توجه به این که این پراپرتی منجر به بروز ارور شده است، مفسر پی‌اچ‌پی دیگر به بررسی پراپرتی آخر که privateProperty$ نام دارد نخواهد رسید که جهت تست این موضوع، می‌توانیم کدهای فوق را به صورت زیر تغییر دهیم:

<?php
ini_set('display_errors', '1');
require_once 'vendor/autoload.php';

$obj = new SokanAcademy\Visibility();
echo $obj->publicProperty;
echo "\n";
// echo $obj->protectedProperty;
// echo "/n";
echo $obj->privateProperty;

در حقیقت، خطی که مسئول چاپ پراپرتی protectedProperty$ بود را کامنت کرده و مجدد فایل فوق را اجرا می‌کنیم:

/var/www/oop/access-modifier$ php index.php 
Public Property
PHP Fatal error: Uncaught Error: Cannot access private property SokanAcademy\Visibility::$privateProperty in /var/www/oop/access-modifier/index.php:10
Stack trace:
#0 {main}
  thrown in /var/www/oop/5-access-modifier/index.php on line 10

همان‌طور که انتظار می‌رفت، امکان دسترسی به پراپرتی‌هایی هم که از جنس private هستند را نخواهیم داشت. این موضوع در ارتباط با متدهایی هم که سطوح دسترسی متفاوتی دارند صادق است به طوری که داریم:

<?php
ini_set('display_errors', '1');
require_once 'vendor/autoload.php';

$obj = new SokanAcademy\Visibility();
// echo $obj->publicProperty;
// echo "\n";
// echo $obj->protectedProperty;
// echo "/n";
// echo $obj->privateProperty;
$obj->showPublicMethod();
$obj->showProtectedMethod();
$obj->showPrivateMethod();

پس از کامنت کردن کدهای مرتبط با چاپ پراپرتی‌ها، هر سه متد تعریف‌شده داخل کلاس Visibility را فراخوانی کرده‌ایم به طوری که در خروجی خواهیم داشت:

/var/www/oop/access-modifier$ php index.php 
This is a public method
PHP Fatal error: Uncaught Error: Call to protected method SokanAcademy\Visibility::showProtectedMethod() from context '' in /var/www/oop/access-modifier/index.php:12
Stack trace:
#0 {main}
  thrown in /var/www/oop/5-access-modifier/index.php on line 12

می‌بینیم که مجدد امکان دسترسی به متدهایی هم که از جنس protected یا private هستند را نخواهیم داشت.

این بخش از محتوا مخصوص کاربرانی است که ثبت‌نام کرده‌اند.
جهت مشاهدهٔ این بخش از محتوا لاگین نمایید.

جمع‌بندی
در این آموزش به بررسی مفهوم Access Modifier در زبان برنامه‌نویسی پی‌اچ‌پی پرداختیم و دیدیم که سطوح دسترسی protected ،public و private چگونه می‌توانند منجر به ایجاد محدودیت در نحوهٔ دستیابی به پراپرتی‌ها و متدهای نوشته‌شده داخل یک کلاس گردند مضاف بر این که دیدیم در مبحث وراثت نیز چگونه می‌توانند مورد استفاده قرار گیرند.

دانلود فایل‌های تمرین

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان