Модификаторы доступа
С помощью специальных модификаторов можно задать область видимости для свойств и методов класса. В PHP есть три таких модификатора:
-
public
к свойствам и методам, объявленным с данным модификатором, можно обращаться из внешнего кода и из любой части программы -
protected
свойства и методы с данным модификатором доступны из текущего класса, а также из классов-наследников -
private
свойства и методы с данным модификатором доступны только из текущего класса
Рассмотрим на примере. Например, у нас есть следующий класс:
class Person {
private $privateA ="private";
public $publicA = "public";
protected $protectedA = "protected";
private function getPrivateMethod() {
echo "private method <br/>";
}
protected function getProtectedMethod() {
echo "protected method <br/>";
}
public function getPublicMethod() {
echo "public method <br/>";
}
function test() {
$this->getPrivateMethod();
$this->getProtectedMethod();
$this->getPublicMethod();
echo "$this->privateA <br />";
echo "$this->protectedA <br />";
echo "$this->publicA <br />";
}
}
Класс определяет три свойства и три метода с разными модификаторами доступа. Из любого метода этого класса мы можем
обратиться к любом методу и любому свойству. Если метод не имеет модификатора доступа,
то по умолчанию его видимость аналогична модификатору public
.
Теперь создадим класс, производный от класса Person
:
class Employee extends Person {
function test() {
//echo $this->privateA; // нельзя, так как privateA - private в классе-родителе
echo $this->protectedA;
echo $this->publicA;
//$this->getPrivateMethod(); // нельзя, так как private в классе-родителе
$this->getProtectedMethod();
$this->getPublicMethod();
}
}
Классу-наследнику доступны все свойства и методы с модификаторами public
и protected
, но
недоступны методы и свойства с
модификатором private
.
Теперь рассмотрим использование класса Person
во внешнем коде:
$person = new Person;
// $person->getPrivateMethod(); // недоступно, так как private
// $person->getProtectedMethod(); // недоступно, так как protected
$person->getPublicMethod();
// echo $person->privateA; // недоступно, так как private
// echo $person->protectedA; // недоступно, так как protected
echo $person->publicA;
При использовании объектов данного класса нам доступны только публичные методы и свойства, а свойства и методы с
модификаторами private
и protected
не доступны.
Доступ к методам и свойствам объекта
Стоит отметить, что в PHP в классе можно обращаться в переменным и методам с модификаторами private
и
protected
объекта этого же класса:
class Account {
private $sum = 0;
function __construct($sum) {
$this->sum = $sum;
}
function getSumFrom($otherAccount, $money) {
$otherAccount -> sum -= $money;
$this -> sum += $money;
}
function prinSum() {
echo "На счете $this->sum у.е.<br>";
}
}
$acc1 = new Account(100);
$acc2 = new Account(400);
$acc1->getSumFrom($acc2, 200);
$acc1->prinSum(); // На счете 300 у.е.
Класс Account
представляет условный класс банковского счета. В приватной переменной $sum
хранится сумма
на счете.
В методе getSumFrom()
в качестве параметра получаем объект этого же класса Account
и сумму перевода. И
поскольку объект представляет
тот же класс Account
, то мы можем обратиться к его свойствам и методам с модификаторами private
и protected
:
$otherAccount -> sum -= $money;
И таким образом, выполнить условный денежный перевод с счета на счет.