Каква е разликата между private и protected в php?

+6 гласа
702 прегледа
попитан 2016 юни 21 от Veronika.Georgieva. (1,460 точки)
Здравейте. Няой може ли да ми обясни каква е разликата между private и protected в PHP?

2 отговори

0 гласа
отговорени 2016 юни 21 от VeskoNikolov (1,620 точки)
редактиран 2016 юни 21 от VeskoNikolov

Ами най-добрият начин да го обясня е чрез пример:

class MyClass
{
    public    $public = 'Public';
    protected $protected = 'Protected';
    private   $private = 'Private';
 
    function printHello()
    {
        echo $this->public; //тук може да ползваме и 3-те, защото е в самия клас
        echo $this->protected; //работи
        echo $this->private; //работи
    }
}
 
$obj = new MyClass(); //създаваме инстанция
 
 
echo $obj->public; // това работи, защото имаме public - иначе казано е достъпно навсякъде това свойство
 
echo $obj->protected; // тук имаме fatal error
echo $obj->private; // тук също имаме fatal error
 
//Извод: private и protected не са достъпни през инстанция на класа
 
$obj->printHello(); // Това показва и 3-те защото реално те се ползват в самият клас, там където дефинираме метода
 
 
//При наследяваме, или още познато като extend ситуацията е следната:
 
class MyClass2 extends MyClass 
{//важно е да забележим, че този клас е наследник на MyClass
 
    // Може да се редекларират (т.е. да се зададат отново) public и protected свойствата, но не и private
    protected $protected = 'Protected2';
 
    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}
 
$obj2 = new MyClass2(); //създаваме инстанция на втория клас
 
echo $obj2->public; // това работи
echo $obj2->protected; // тук имаме fatal error
echo $obj2->private; // а това връща undefined т.е. изобщо не е пренесено при самото онаследяване на класа
$obj2->printHello(); // Показва public, protected2 и undefined, защото както казахме private свойствата не са онаследими

Накратко:

  • public - такова свойство (или метод) е достъпно навсякъде. Може да бъде видяно през инстанция, през клас наследник, инстанция на наследник.

  • protected - такова свойство (или метод) е достъпно в самият клас (т.е. в неговите методи), както и в негови наследници, но не и през инстанции.

  • private - тук имаме най-голяма сигурност измежду трите. Това свойство не се онаследява и не е достъпно през инстанция. Единствено може да бъде ползвано през метод на класа, в който се дефинира.

0 гласа
отговорени 2016 юни 21 от Deyan Delev (1,830 точки)
Това са така наречените "Модификатори за достъп". С тях може да се контролира нивото на видимост (scope) на членове и методи на даден клас. Това се извършва с трите ключови думи за PHP: public (публичен),  private (частен) и protected (защитен).

Public - тези членове и методи са достъпни в рамките на целият скрипт.
Ако са даден метод не е определена област на видимост, той по подразбиране е public.

Protected - тук членовете и методите, които са идентифицирани като protected са достъпни само от обекта или от наследяващия клас.

Private - идентифицираните по този начи  методи и членове, са достъпни само от самият обект и не са достъпни за никой наследяващ клас.
...