تفاوت protected ،public و private در PHP چیست؟ در اکثر زبان‌های برنامه نویسی شیءگرا، یک سری اصلاح‌کننده دسترسی (Access Modifier) داریم که دسترسی به متدها و پراپرتی‌ها در کلاس را مدیریت می‌کند. این Access Modifiers در PHP با کلیدواژه‌های protected ،public و private شناخته می‌شوند. protected ،public و private در زبان‌های برنامه نویسی دیگر مانند جاوا، جاوا اسکریپت، سی شارپ، سی پلاس پلاس و... که شیءگرا هستند نیز وجود دارد، اما ممکن است یک سری تفاوت‌های جزئی با PHP داشته باشند. تفاوت protected ،public و private در شیءگرایی یکی از سوالات رایج در مصاحبه برنامه نویسی است. در این مقاله از آموزش برنامه نویسی، به بررسی Access Modifierهای PHP تحت عنوان‌های protected ،public و private در کلاس‌ها می‌پردازیم.

در این مقاله با موضوعات زیر آشنا خواهیم شد:

  • اصلاح‌کننده دسترسی یا Access Modifier چیست؟
  • Property چیست؟
  • Method چیست؟
  • تفاوت protected ،public و private در کلاس PHP چیست؟
  • public در کلاس PHP چیست؟
  • protected در کلاس PHP چیست؟
  • private در کلاس PHP چیست؟
  • جمع‌بندی تفاوت protected ،public و private در شیءگرایی

اصلاح‌کننده دسترسی یا Access Modifier چیست؟

Access Modifierها در PHP برای کنترل سطوح دسترسی به Property و Methodهای یک کلاس به کار می‌رود. یعنی توسط Access Modifier تعیین می‌کنیم که چگونه باید به یک متد یا پراپرتی دسترسی داشته باشیم و یا دسترسی به آن را محدود کنیم. Access Modifiers در کلاس‌های شیءگرای PHP با 3 کلیدواژه protected ،public و private تعریف می‌شود.

در حقیقت یکی  از اصول شیءگرایی، کپسوله‌سازی (Encapsulation) است؛ یعنی پراپرتی و متدهای خود را می‌توانیم مانند یک کپسول در کنار هم جمع کنیم و از دسترسی‌های غیرمجاز به آن‌ها محافظت کنیم. برای اطلاعات بیشتر درباره اصول شیءگرایی، مقاله زیر را مطالعه کنید:

Property چیست؟

پراپرتی‌ها در کلاس‌ها شبیه متغیرها هستند با این تفاوت که به اول آن‌ها سه کلمه کلیدی public یا protected یا private اضافه می‌شود. مانند مثال زیر:

<?php

class Fruit {
    public $name = "Banana";
    public $color = "Yellow";
    public $price = 200;
}

Method چیست؟

متدها نیز مانند توابع هستند با این تفاوت که به اول آن‌ها نیز سه کلمه کلیدی public یا protected یا private اضافه می‌شود. مانند مثال زیر:

<?php

class Fruit {
    public function name(){
        echo = "Banana";
    }

    public function color(){
        echo = "Yellow";
    }

    public function price(){
        echo = 200;
    }
}

تفاوت protected ،public و private در کلاس PHP چیست؟

Access Modifierهای protected ،public و private در PHP

در برنامه‌نویسی شیءگرا، سه نوع دسترسی داریم که برای اعضای یک کلاس (پراپرتی و متد) تعریف می‌شوند. این نوع دسترسی‌ها تعیین می‌کنند که چگونه به اعضای یک کلاس دسترسی داشته باشیم. این سه نوع دسترسی عبارت‌اند از:

  1. public
  2. protected
  3. private

تفاوت protected ،public و private در PHP

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

public در کلاس PHP چیست؟

در این قسمت از مقاله تفاوت public و protected و private به اصلاح‌کننده دسترسی public در کلاس‌های PHP می‌پردازیم. همانطور که در جدول بالا اشاره شد، ویژگی (Property) یا رفتار (Method) که سطح دسترسی آن public باشد یعنی عمومی است و از هر قسمت برنامه (حارج از کلاس، داخل کلاس، از کلاس‌های دیگر) می‌توان به Property و Methodهای این کلاس دسترسی پیدا کرد. به مثال زیر توجه کنید:

<?php

class Fruit {
    public $name = "Banana";

    public function getColor(){
        echo "Yellow";
    }
}

$myFruit = new Fruit();
echo $myFruit->name ; // Banana
$myFruit->getColor(); // Yellow

در کلاس بالا از محیط بیرون کلاس، به پراپرتی‌ name$ و متد ()getColor دسترسی داریم (از محیط بیرون کلاس) چون سطح دسترسی آن‌ها از نوع public است. همچنین در مثال زیر:

<?php

class Fruit{
    public $name = "Banana";

    public function getName(){
        echo $this->name; //Banana
    }
}

از داخل خود کلاس و از متد ()getName به پراپرتی name$ دسترسی داریم (از داخل کلاس) چون نوع دسترسی آن public است. به مثال زیر هم توجه کنید:

<?php

class Fruit {
    public $name = "Banana";

    public function getName(){
        echo $this->name; //Banana
    }
}

class Banana extends Fruit{
    public function getNameInFruit(){
        $this->getName(); //Banana
    }
}

از کلاس Banana که از کلاس Fruit ارث‌بری کرده است می‌توانیم به متد ()getName در Fruit دسترسی داشته باشیم (از یک کلاس به کلاس دیگر)، چون از نوع public است.

protected در کلاس PHP چیست؟

در این قسمت از مقاله تفاوت public و protected و private به اصلاح‌کننده دسترسی protected در کلاس‌های PHP می‌پردازیم. اگر سطح دسترسی Property یا Methodهای یک کلاس از نوع protected باشد، فقط از داخل خود کلاس یا توسط کلاس‌های مشتق شده (ارث‌بری شده) قابل دسترس است. به مثال زیر توجه کنید:

<?php

class Fruit {
    protected function name(){
        echo "Banana";
    }

    protected function getFruitName(){
        $this->name(); //Banana
    }
}

$myFruit = new Fruit();
$myFruit->name(); //Fatal error: Uncaught Error: Call to protected method Fruit::name() from global scope

در مثال بالا چون متد ()name از نوع protected است، می‌توان از داخل خود کلاس و از متد ()getFruitName به متد ()name دسترسی داشت. اما نمی‌توان از بیرون کلاس به آن دسترسی داشت و با Fatal error مواجه خواهیم شد. همچنین به مثال زیر توجه کنید:

<?php

class Fruit {
    protected function name(){
        echo "Banana";
    }
}

class Banana extends Fruit{
    public function getFruitName(){
        $this->name(); //Banana
    }
}

در کد بالا چون کلاس Banana از کلاس Fruit ارث‌بری کرده است، می‌توان از داخل کلاس Banana و از متد ()getFruitName به متد ()name در کلاس Fruit که از نوع protected است دسترسی پیدا کرد.

private در کلاس PHP چیست؟

در این قسمت از مقاله تفاوت public و protected و private به اصلاح‌کننده دسترسی private در کلاس‌های PHP می‌پردازیم. اگر سطح دسترسی Property یا Methodهای یک کلاس از نوع private باشد، فقط و فقط از داخل خود کلاس می‌توان به آن دسترسی پیدا کرد. به مثال زیر توجه کنید:

<?php

class Fruit {
    private function name(){
        echo "Banana";
    }
}

$myFruit = new Fruit();
$myFruit->name(); //Fatal error: Uncaught Error: Call to private method Fruit::name() from global scope

همانطور که در کد بالا مشاهده می‌کنید، از بیرون کلاس نمی‌توان به متد()name داخل کلاس Fruit که از نوع private است دسترسی پیدا کرد. همچنین به مثال زیر دقت کنید:

<?php

class Fruit {
    private function name(){
        echo "Banana";
    }
}

class Banana extends Fruit{
    public function getFruitName(){
        $this->name(); //Fatal error: Uncaught Error: Call to private method Fruit::name() from scope Banana
    }
}

در کد بالا با اینکه Banana از Fruit ارث‌بری کرده است، اما به دلیل اینکه متد ()name در کلاس Fruit از نوع private است، از کلاس Banana نمی‌توان به آن دسترسی پیدا کرد اما اگر public یا protected بود می‌توانستیم به آن دسترسی پیدا کنیم. به مثال زیر دقت کنید:

<?php

class Fruit {
    private function name(){
        echo "Banana";
    }
    
    public function getFruitName(){
        $this->name(); //OK
    }
}

در کد بالا از متد ()getFruitName می‌توان به متد ()name که از نوع private است دسترسی پیدا کرد چون هر دو داخل کلاس Fruit هستند.

جمع‌بندی تفاوت protected ،public و private در شیءگرایی

در انتهای مقاله تفاوت protected ،public و private در PHP چیست؟ به یک مثال دیگر می‌پردازیم:

<?php

class Fruit {
  public $name;
  protected $color;
  private $weight;
}

$myFruit = new Fruit();
$myFruit->name = "Banana"; // OK
$myFruit->color = "Yellow"; // Fatal error: Uncaught Error: Cannot access protected property Fruit::$color
$myFruit->weight = 200; // Fatal error: Uncaught Error: Cannot access private property Fruit::$weight

در کلاس PHP بالا سه نوع پراپرتی از نوع protected ،public و private تعریف کردیم. همانطور که مشاهده می‌کنید، از بیرون کلاس فقط به پراپرتی name$ دسترسی داریم چون از نوع public است اما به پراپرتی color$ از نوع protected و weight$  از نوع private نمی‌توانیم از بیرون کلاس به‌صورت مستقیم دسترسی داشته باشیم.

جمع‌بندی

تفاوت protected ،public و private در کلاس PHP چیست؟ در این مقاله به Access Modifiers (اصطلاح‌کننده‌های دسترسی) در کلاس‌های شیءگرایی PHP پرداختیم. به‌طور کلی، Property یا Method که دسترسی آن از نوع public باشد، از همه جای برنامه قابل دسترسی است در سطح دسترسی protected نیز فقط از داخل خود کلاس و کلاس‌های مشتق شده (ارث‌بری شده) به آن دسترسی داریم. در سطح دسترسی private نیز فقط و فقط از داخل خود کلاس به آن دسترسی داریم. اگر سوالی در مورد تفاوت public و protected و private در PHP دارید، لطفا در قسمت نظرات با ما در میان بگذارید.