آموزش شی گرایی / OOP در PHP (سطح دسترسی)

صفحه اصلی » انجمن ها
« در صورت وجود هرگونه اشکال در این مطلب لطفا گزارش اشکال آن را ارسال نمایید »

در شی گرایی PHP، جهت دسترسی به متودها یا خصوصیت های هر کلاس می توان از سه روش protected یا public‍ یا private استفاده کرد. این نوع دسترسی ها تعیین کننده نوع ارجاع، مقداردهی یا بازگردانی مقادیر و توابع می باشد. برای برخی از شی ها (Object) شاید نیاز باشد دسترسی یک خصوصیت فقط از داخل آن کلاس یا دسترسی به آن از همه جا قابل انجام باشد.

مقالات و آموزش
بیشتر بخوانید
به طور کلی ما برای خصوصیت ها و متودها می توانیم تعیین کنیم از کجا مقادیر یا توابع آنها قابل دسترسی می باشد.
در کد زیر ما سه خصوصیت داریم که هر کدام به ۳ روش متفاوت نوشته شده است و در ادامه پس ایجاد "شی"، این ۳ خصوصیت را مقداردهی می کنیم:
class Test {
        public $name;
        protected $color;
        private $weight;
}

$test = new Test();
$test->name = 'Mango'; // OK
$test->color = 'Yellow'; // Error
$test->weight = '300'; // Error
همانطور که در کد بالا می بینید، خصوصیت name را می توان مقداردهی کرد، اما خصوصیت های color و weight را نمی توان مقداردهی کرد.
سطح دسترسی public اجازه دسترسی به خصوصیت یا متودها را خارج از کلاس می دهد، اما سطح دسترسی private و protected فقط از داخل کلاس قابل دسترسی می باشد.
حالا به کد زیر دقت نمایید که این سطح دسترسی ها را برای متود ها بررسی می کنیم:
class Test {
        public function name(){
                echo 'name';
        }
        protected function color(){
                echo 'color';
        }
        private function weight(){
                echo 'weight';
        }
}

$test = new Test();
$test->name(); // OK
$test->color(); // Error
$test->weight(); // Error
در کد بالا چون متود name از نوع public می باشد، دسترسی به آن صورت می گیرد و مقدار name چاپ خواهد شد.
اما متودهای color و weight به دلیل سطح دسترسی محدود، قابل دسترسی نمی باشند و خطا دریافت می شود.
با این شرایط چه تفاوتی بین protected و private هست؟
سطح دسترسی private فقط و فقط اجازه دسترسی از طریق همان کلاس را می دهد، اما سطح دسترسی protected به کلاس هایی که از کلاس اصلی نیز مشتق شده باشد اجازه دسترسی می دهد.
به کد زیر دقت کنید:
class Father {
        protected $name = 'Fidaxo';
}

class Child extends Father {
        public function getName(){
                return $this->name;
        }
}

$child = new Child();
echo $child->getName(); // Output: Fidaxo
در کد بالا کلاسی به نام Father داریم. همچنین کلاسی به نام Child ایجاد کردیم که از کلاس Father مشتق شده است.
زمانی که کلاسی را extends می کنیم، کلاس فرزند (در این اینجا Child) به تمام خصوصیت ها و متودهای کلاس والد (در اینجا Father) دسترسی پیدا می کند.
با این توضیحات ما ابتدا یک شی به نام $child می سازیم، سپس متود getName را صدا می زنیم، چون این متود از نوع public است، ما به آن دسترسی داریم.
در متود getName ما مقدار name را از کلاس دیگری که از آن مشتق گرفته ایم صدا می زنیم.
این کد به درستی عمل می کند و مقدار "Fidaxo" چاپ می شود. اما اگر سطح دسترسی name روی private می بود،خطا دریافت می شد.
چگونه به خصوصیت ها یا متودهای حفاظت شده، خارج از کلاس دسترسی پیدا کنیم؟
فرض کنید یک مقدار protected یا private در کلاس Test داریم، می خواهیم پس از ایجاد "شی" به آن مقدار دسترسی پیدا کنیم.
برای این موضوع می توانیم یک متود public داشته باشیم و خارج از کلاس این متود public را صدا بزنیم و در آن مقدار مورد نظرمان را برگردانیم.
به کد زیر دقت کنید:
class Test {
        protected $name = 'Fidaxo';

        public function getName(){
                return $this->name;
        }
}

$test = new Test();
echo $test->getName(); // Output: Fidaxo
همانطور که مشاهده می کنید، مقدار protected ما با واسطه getName چاپ شد.
دسترسی به کلاس های static
یک نوع کلاس داریم به نام static. این نوع کلاس ها دسترسی مستقیم دارند و نیازی نیست هر بار "شی" جدید ساخته شود.
یک بار ساخته شده و مقادیر آن در حافظه می ماند و برای دفعات بعدی نیاز به تعریف مجدد ندارد.
این کلاس ها باید public باشند.
نحوه ساخت و دسترسی به مقادیر کلاس های static مانند کد زیر است:
class Test {
        public static $name = 'Fidaxo';
                
        public static function getName(){
                return self::$name;
        }
}

echo Test::getName(); // Output: Fidaxo
شرایط کلاس های static
در اینجا نیازی نیست از new برای ساخت شی جدید استفاده کرد به جای $this-> باید از ::self استفاده کرد
اینکه در چه زمانی باید از protected یا public یا private یا نوع static استفاده کرد، بستگی به کد نویسی و نیاز سیستم مورد نظر شما دارد.
اما اکثر برنامه نویس ها برای زدن کدهای کمتر از public کردن متودها و خصوصیت ها استفاده می کنند.

اشتراک گذاری مطلب

این مطلب را با دوستانتان در شبکه های اجتماعی به اشتراک بگذارید و معرفی نمایید

لطفا جهت ثبت نظر یا پرسش و پاسخ ابتدا وارد سایت شوید یا ثبت نام نمایید
مــطالب مــرتبط با این مــوضـوع

دیگر مطالب خواندنی

آخرین اخبار تکنولوژی، آموزش برنامه نویسی، توسعه زبان ها و ... را در وبلاگ آکادمی فیداکسو دنبال کنید
همچنین از آخرین خبرها و تخفیفات سایت نیز اینجا آگاه شوید