سطح دسترسی Protect

سطح دسترسی protect اجازه می‌دهد که اعضای کلاس، فقط در کلاسهای مشتق شده از کلاس پایه قابل دسترسی باشند. بدیهی است که خود کلاس پایه هم می‌تواند به این اعضا دسترسی داشته باشد. کلاس‌هایی که از کلاس پایه ارث بری نکرده‌اند نمی‌توانند به اعضای با سطح دسترسی protect یابند. در مورد سطوح دسترسی public و private قبلاً توضیح دادیم. در جدول زیر نحوه دسترسی به سه سطح ذکر شده نشان داده شده است :

قابل دسترسی در public private protected
داخل کلاس true true true
خارج از کلاس true false false
کلاس مشتق true false true

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

   1: <?php
   2: 
   3:     class classParent
   4:     {
   5:         protected $protectedMember = 10;
   6:         private   $privateMember   = 20;
   7:         public    $publicMember    = 30;
   8:     }
   9:     
  10:     class classChild extends classParent
  11:     {
  12:         public function __construct ()
  13:         {
  14:             echo $this -> publicMember    .'<br/>';
  15:             echo $this -> protectedMember .'<br/>';
  16:             echo $this -> privateMember;
  17:         }
  18:     }   
  19:     
  20:     $child = new classChild();
  21:  
  22: ?>
10
20

(!) Notice: Undefined property: classChild::$privateMember

کدهایی که با خط قرمز نشان داده شده‌اند نشان دهنده وجود خطا است. همانطور که در خط 16 مشاهده می‌کنید کلاس classChild سعی می‌کند که به عضو private کلاس classParent دسترسی یابد. از آنجاییکه اعضای private در خارج از کلاس قابل دسترسی نیستند، حتی کلاس مشتق در خط 16 نیز ایجاد خطا می‌کند. اگر شما به خط 14 توجه کنید کلاس classChild می‌تواند به عضو protect کلاس classParent دسترسی یابد چون کلاس classChild از کلاس classParent مشتق شده است. حال کد زیر را در نظر بگیرید :

   1: <?php
   2: 
   3:     class classParent
   4:     {
   5:         public    $publicMember    = 10;
   6:         protected $protectedMember = 20;
   7:         private   $privateMember   = 30;        
   8:     }
   9:     
  10:     $parent =new classParent();
  11:     
  12:     echo $parent -> publicMember;
  13:     echo $parent -> protectedMember;
  14:     echo $parent -> privateMember;
  15:  
  16: ?>
10
(!) Fatal error: Cannot access protected property classParent::$protectedMember

همانطور که در کد بالا مشاهده می‌کنید از آنجاییکه اعضای protected و private در خارج از کلاس قابل دسترسی نیستند خطوط 13 و 14 ایجاد خطا می‌کنند.