Модификаторы доступа в PHP
Модификатор доступа (его также называют ключевым словом видимости) определяет, откуда можно использовать свойство или метод.
В PHP их три:
public— доступен откуда угодно; это значение по умолчаниюprotected— доступен внутри класса и внутри производных от него классовprivate— доступен ТОЛЬКО внутри класса, в котором определён
Примечание: Если не указать модификатор, PHP считает свойство или метод public.
Модификатор доступа public
Если пометить свойство или метод как public, к нему сможет обратиться любой код, как внутри класса, так и снаружи.
В следующем примере код вне класса может использовать и свойство $name, и метод get_details().
Пример с public
Код вне класса задаёт публичное свойство и вызывает публичный метод:
Вывод: PHP-скрипт
<?php
class Fruit {
public $name;
public function get_details() {
echo "Название: " . $this->name . ".";
}
}
$apple = new Fruit();
$apple->name = "Apple"; // Доступно напрямую
$apple->get_details();
?>
Модификатор доступа private
private — самый строгий модификатор: обратиться к такому свойству или методу может только код внутри класса, где они определены.
В следующем примере $name имеет модификатор private, поэтому прямое обращение к нему извне класса заканчивается неудачей.
Пример с private
Присваивание значения приватному свойству извне класса вызывает фатальную ошибку:
Вывод: PHP-скрипт
<?php
class Fruit {
private $name;
public function get_details() {
echo "Название: " . $this->name . ".";
}
}
$apple = new Fruit();
$apple->name = "Apple"; // Ошибка: нельзя обратиться к приватному свойству
$apple->get_details();
?>
Модификатор доступа protected
protected находится посередине: доступ есть у самого класса и его производных классов (дочерних классов), но не у внешнего кода.
В следующем примере $name имеет модификатор protected, поэтому прямой доступ извне запрещён.
Пример с protected
Присваивание значения защищённому свойству извне класса вызывает фатальную ошибку:
Вывод: PHP-скрипт
<?php
class Fruit {
protected $name;
public function get_details() {
echo "Название: " . $this->name . ".";
}
}
$apple = new Fruit();
$apple->name = "Apple"; // Ошибка: нельзя обратиться к защищённому свойству
$apple->get_details();
?>
protected и наследование
Дочерний класс может читать унаследованное защищённое свойство:
Вывод: PHP-скрипт
<?php
class Fruit {
protected $name;
public function setType($name) {
$this->name = $name;
}
}
class Apple extends Fruit {
public function getType() {
echo "Название: " . $this->name . ".";
}
}
$apple = new Apple();
$apple->setType("Apple");
echo $apple->getType();
?>