آموزش شی گرایی در php و تعیین سطح دسترسی به متغیرها و متدهای کلاس

علیرضا حاتمی نیا 1606

سلام خدمت شما علاقه مندان به آموزش های برنامه نویسی و آموزش php. همچنان مبحث آموزش شی گرایی در php را ادامه می دهیم. در جلسه قبل با آموزش وراثت در شی گرایی درخدمت شما بودیم. در این جلسه به آموزش نحوه دسترسی به متغیرها و خصوصیات یک کلاس در php می پردازیم.

دسترسی به خوصیات یا متدهای یک کلاس

به خاطر دارید که در جلسات قبل برای تعریف یک متغیر یا متد درون یک کلاس ابتدا از کمه کلیدی public قبل از آن ها استفاده می کردیم. این کلمه کلیدی همراه با 2 کلمه کلیدی دیگر نحوه کنترل اشیا جهت دسترسی به خصوصیات یا متدهای یک کلاس استفاده می شوند.
پس php این امکان را به شما می دهد تا نحوه دسترسی به متدها و متغیرهای یک کلاس در خارج از یک کلاس را تعیین کنید.

3 نوع دستری به متغیرها و متدهای یک کلاس در php وجود دارد:

  • public: امکان دسترسی به متغیرها و متدها از نوع public در خارج از کلاس امکان پذیر است.
  • protected: امکان دسترسی به متغیرها و متدها از نوع protected فقط در کلاس جاری و فرزندان آن کلاس امکان پذیر است.
  • private: امکان دسترسی و به متغیرها و متدها از نوع private فقط در کلاس جاری امکان پذیر است.

مثال برای سطح دسترسی public و protected

در مثال جلسه قبل کلیه متدها و متغیرها را به صورت public تعریف می کردیم و توجه کردید که در خارج از کلاس همه متدها و متغیرها کاملا در دسترس بودند. حال قصد داریم که متد get_height() را به صورت protected تعریف کنیم تا ببینم چه اتفاقی در کلاس فرزند که avatar می باشد رخ می دهد.

human class

class human {
    public $name;
    public $height;
    public $gender;
    function __construct()
    {
        echo 'This is human classs' . '<br>';
    }
    public function get_name() {
        echo $this -> name . '<br>';
    }
    public function get_gender() {
        echo $this -> gender . '<br>';
    }
    protected function get_height(){
        echo $this -> height . '<br>';
    }
}

کلاس فرزند avatar که خصوصیات کلاس human را به ارث می برد.

avatar class

class avatar extends human {
    function __construct()
    {
        parent::__construct();
        echo 'This is avatar classs' . '<br>';
    }
    public function flying(){
        echo 'flying';
    }
}
$avatar = new avatar();
$avatar -> name = 'big avatar';
$avatar -> gender = 'female';
$avatar -> height = 3;
$avatar -> get_name();
$avatar -> get_gender();
$avatar -> get_height();
$avatar -> flying();

خروجی کدهای بالا به صورت زیر است:

This is human classs
This is avatar classs
big avatar
female

Fatal error: Uncaught Error: Call to protected method human::get_height() from context '' in C:\xampp\htdocs\avatar.php on line 21
Error: Call to protected method human::get_height() from context '' in C:\xampp\htdocs\avatar.php on line 21

توجه دارید که برنامه خطا داده است چون متد get_height() از نوع سطح دسترسی protected انتخاب شده است نمی تواند در خارج از کلاس استفاده شود و فقط می تواند درون کلاس پدر و کلاس های فرزند آن استفاده شود.

حال یک متد جدید به نام get_protected() از نوع public در کلاس avatar می سازیم و متد get_height() را درون آن return می کنیم.

class avatar extends human {
    function __construct()
    {
        parent::__construct();
        echo 'This is avatar classs' . '<br>';
    }
    public function flying(){
        echo 'flying';
    }
    public function get_protected() {
        return $this -> get_height();
    }
}

$avatar = new avatar();
$avatar -> name = 'big avatar';
$avatar -> gender = 'female';
$avatar -> height = 3;
$avatar -> get_name();
$avatar -> get_gender();
$avatar -> get_protected();
$avatar -> flying();

خروجی کدهای بالا به صورت زیر می شود:

This is human classs
This is avatar classs
big avatar
female
3
flying

مثال برای سطح دسترسی از نوع private


در مثال بالا متد get_height() را از نوع سطح دسترسی private تعیین می کنیم:

Human class

class human {
    public $name;
    public $height;
    public $gender;
    function __construct()
    {
        echo 'This is human classs' . '<br>';
    }
    public function get_name() {
        echo $this -> name . '<br>';
    }
    public function get_gender() {
        echo $this -> gender . '<br>';
    }
    private function get_height(){
        echo $this -> height . '<br>';
    }
}

Avatar class

class avatar extends human {
    function __construct()
    {
        parent::__construct();
        echo 'This is avatar classs' . '<br>';
    }
    public function flying(){
        echo 'flying';
    }
    public function get_protected() {
        return $this -> get_height();
    }
}

$avatar = new avatar();
$avatar -> name = 'big avatar';
$avatar -> gender = 'female';
$avatar -> height = 3;
$avatar -> get_name();
$avatar -> get_gender();
$avatar -> get_protected();
$avatar -> flying();

خروجی کدهای بالا بصورت زیر می شود:

This is human classs
This is avatar classs
big avatar
female

Fatal error: Uncaught Error: Call to private method human::get_height() from context 'avatar' in C:\xampp\htdocs\avatar.php on line 14
Error: Call to private method human::get_height() from context 'avatar' in C:\xampp\htdocs\avatar.php on line 14

همانطور که مشاهده می کنید برنامه بعلت اینکه متد get_height() در کلاس human به صورت private تعیین سطح دسترسی شده است خطا داده است. در این نوع موارد فقط می توان به متد از نوع private فقط در کلاس خود دسترسی داشت.

 

کلمات کلیدی

لینک های مرتبط

طراحی سایت اصفهان
علیرضا حاتمی نیا
طراح و برنامه نویس وب
طراحی وبسایت های واکنش گرا
طراحی و پیاده سازی سیستم مدیریت محتوا
سئو و بهینه سازی سایت