php

جلسه ۵۴: کلاس ها و ارث بری قسمت ۵ در php

دسترسی متد و ویژگی

در این بخش می خواهیم درمورد اصلاح کنندگان دسترسی مانند public، private و protected و همچنین نحوه تاثیر آنها بر دسترسی اعضا صحبت کنیم. سرفصل مباحث این جلسه به شرح زیر می باشد:
  • public
    • مثال
  • private
    • مثال
  • protected
    • مثال
اصلاح کنندگان دسترسی، میزان دسترسی متغیرهای درون کلاس را مشخص می کنند. در این بخش می خواهیم درمورد سه نوع دسترسی که می توان به متدها و ویژگی ها اعمال کرد صحبت کنیم. اصلاح کنندگان دسترسی، کنترل دسترسی برای متدها یا ویژگی هایی که به آنها اعمال شدند را فراهم می کنند.

public

تعریف یک متد یا ویژگی به عنوان public به متد یا ویژگی این قابلیت را می دهد که قابل دسترسی  توسط بخش های زیر باشند:
  • کلاسی که در آن تعریف شده اند.
  • کلاس هایی که از کلاس اولیه که در آن تعریف شده اند ارث بری می کنند.
  • هر نوع شی، کلاس یا کد خارجی که خارج از محدوده ارث بری کلاس است.

مثال

برای درک بهتر نحوه اجرای کلمه کلیدی public، قطعه کد زیر را اجرا کنید:
<?php
class Car
{
    public $name = " ";

    public function display()
    {
        echo "Name: $this->name" . "\n";
    }

    public function __construct($name)
    {
        $this->name = $name;

    }
}

$obj1 = new Car("BMW"); //creating an object of car and setting its name as BMW
echo "Name: " . $obj1->name; //accessing the "name" property of obj1 directly outside of class
echo "\n";

$obj2 = new Car("Mercedes"); //creating an object of car and setting its name as Mercedes
echo $obj2->display(); //accessing the "display" method of obj1 directly outside of class
?>
کد بالا نشان می دهد که زمانی که کد اصلی می خواهد به متغیر protected به نام power$ دسترسی پیدا کند، خطای : نمی توانید به ویژگی protected دسترسی پیدا کنید، ایجاد می شود. با حذف خط بیستم کد بدون هیچ گونه خطایی اجرا خواهد شد. در جدول زیر تمامی تفاوت های public، private و protected آمده است.

توجه: اشیایی که به یک کلاس مربوط می شوند می توانند به اعضای private و protected هم دسترسی داشته باشند حتی اگر در یک ارث بری نباشند. برای درک بهتر موضوع قطعه کد زیر را اجرا کنید:
<?php
 
class Test
{
	private $privateM=1;
	protected $protectedM=2;
	
	public function increase(Test $test)
	{
		$test-> privateM *= 10;
		$test-> protectedM *= 10;
	}
  
	public function __toString()
	{
		return "privateMember = ".$this->privateM.", protectedMember = ".$this->protectedM;
	}
}
 
$test1 = new Test();
$test2 = new Test();
echo "before test1: $test1\n";
 
//call $test2 method on another instance of the Test class - $test1
$test2->increase($test1);
 
echo "after test1: $test1\n";
?>
به پایان بحث در مورد کلاس ها رسیدیم و در بخش بعدی می خواهیم درمورد مفهوم ارث بری صحبت کنیم. مثال بالا نشان می دهد که می توانیم از هر بخشی از کد که خارج از محدوده ارث بری است، به ویژگی public به نام name$ و متد public به نام ()display دسترسی داشته باشیم.

private

تعریف یک متد یا ویژگی به عنوان private به متد یا ویژگی این قابلیت را می دهد که قابل دسترسی  توسط بخش های زیر باشند:
  • تنها در کلاسی که در آن تعریف شده اند.
متد یا ویژگی private تنها در کلاسی که تعریف شده اند قابل دسترسی هستند.

مثال

برای درک بهتر نحوه اجرای کلمه کلیدی private، قطعه کد زیر را اجرا کنید:
<?php
class Car
{
    public $name = " ";
    private $plateNumber;

    public function display()
    {
        echo "Name: $this->name" . "\n";
    }

    public function setPlateNumber($number)
    { //sets value of property plateNumber
        $this->plateNumber = $number;
    }

    public function getPlateNumber()
    { //returns the property "plateNumber"
        return $this->plateNumber;
    }

    public function __construct($name, $number)
    {
        $this->name = $name;
        $this->plateNumber = $number;

    }
}

$obj1 = new Car("BMW", 68775); //making a car object with values of name and platenumber set
echo $obj1->display(); //displaying name of car
echo "Plate number: " . $obj1->getPlateNumber(); //accessing plateNumber by calling getPlateNumber method
echo "\n";
$obj1->setPlateNumber(47798); //changing PlateNumber value using setPlateNumber
echo "Plate number: " . $obj1->getPlateNumber(); //accessing plateNumber by calling getPlateNumber method
echo "\n";

$obj2 = new Car("Mercedes", 89976);
//uncomment the line below and try running the code
//you will get an error as you cannot directly access a private member outside of the class it is declared in
//echo $obj2->plateNumber;
?>
مثال بالا نشان می دهد که متدهای ()display و ()getPlateNumber و ()setPlateNumber در کلاس Car، می توانند به متد private به نام plateNumber$ دسترسی داشته باشند. از توابع get و set برای دسترسی و مقداردهی به اعضای private کلاس استفاده می شود. در کد بالا، زمانی که بخواهید به صورت مستقیم به عضو private به نام plateNumber$ دسترسی پیدا کنید، به دلیل اینکه خارج از محدوده دسترسی این ویژگی هستید، با خطای ویژگی تعریف نشده است مواجه خواهید شد.

protected

تعریف یک متد یا ویژگی به عنوان protected به متد یا ویژگی این قابلیت را می دهد که قابل دسترسی  توسط بخش های زیر باشند:
  • کلاسی که در آن تعریف شده اند.
  • کلاس هایی که از کلاس اولیه که در آن تعریف شده اند ارث بری می کنند.
ابن حالت به اشیا خارجی، کلاس ها و یا کدهایی خارج از ارث بری کلاس اجازه دسترسی به متدها یا ویژگی ها را نمی دهد و اگر تلاشی برای انجام این کار کنید، با خطا مواجه خواهید شد.

مثال

برای درک بهتر نحوه اجرای کلمه کلیدی protected، قطعه کد زیر را اجرا کنید:
<?php
class Car
{
    public $name = " ";
    protected $power = 2500;

    public function display()
    {
        echo "Name: $this->name" . "\n";
    }

    public function __construct($name)
    {
        $this->name = $name;

    }
}

$obj = new Car("Blue");
echo $obj->display();
echo $obj->power; //comment out this line to prevent an error
?>
کد بالا نشان می دهد که زمانی که کد اصلی می خواهد به متغیر protected به نام power$ دسترسی پیدا کند، خطای : نمی توانید به ویژگی protected دسترسی پیدا کنید، ایجاد می شود. با حذف خط بیستم کد بدون هیچ گونه خطایی اجرا خواهد شد. در جدول زیر تمامی تفاوت های public، private و protected آمده است.

توجه: اشیایی که به یک کلاس مربوط می شوند می توانند به اعضای private و protected هم دسترسی داشته باشند حتی اگر در یک ارث بری نباشند. برای درک بهتر موضوع قطعه کد زیر را اجرا کنید:
<?php
 
class Test
{
	private $privateM=1;
	protected $protectedM=2;
	
	public function increase(Test $test)
	{
		$test-> privateM *= 10;
		$test-> protectedM *= 10;
	}
  
	public function __toString()
	{
		return "privateMember = ".$this->privateM.", protectedMember = ".$this->protectedM;
	}
}
 
$test1 = new Test();
$test2 = new Test();
echo "before test1: $test1\n";
 
//call $test2 method on another instance of the Test class - $test1
$test2->increase($test1);
 
echo "after test1: $test1\n";
?>
به پایان بحث در مورد کلاس ها رسیدیم و در بخش بعدی می خواهیم درمورد مفهوم ارث بری صحبت کنیم.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا