С помощью специальных модификаторов можно задать область видимости для свойств и методов класса. В 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;
И таким образом, выполнить условный денежный перевод с счета на счет.