Ами най-добрият начин да го обясня е чрез пример:
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 - тук имаме най-голяма сигурност измежду трите. Това свойство не се онаследява и не е достъпно през инстанция. Единствено може да бъде ползвано през метод на класа, в който се дефинира.