Управление доступом к свойствам и методам
По умолчанию доступ к свойствам и методам класса ничем не ограничен, но не всегда это является допустимым. Например, метод set_name из предыдущей статьи не позволяет присвоить свойству name значение, превышающее по длине 10 символов.
function set_name($text) { if (strlen($text)<=10) { $this->name = $text; } }
Но при этом остается возможность присвоения некорректного значения свойству name напрямую, например:
$this->name = "слишком длинное имя";
Решение заключается в ограничении доступа к свойствам и методам класса при помощи модификаторов доступа. В РНР существуют три модификатора доступа:
public — нет ограничений на доступ.
private — доступ разрешен только изнутри класса.
protected — доступ разрешен только изнутри класса и всех его потомков.
По умолчанию все свойства и методы объявляются как public, что означает
отсутствие ограничений на доступ к ним снаружи класса. Но если свойство или метод объявлено как private, доступ к нему из кода за пределами класса будет заблокирован. Ниже приведен пример попытки доступа к приватному свойству name:
<?php class Animal { private $name; function set_name($text) { $this->name = $text; } function get_name() { return $this->name; } } $lion = new Animal; $lion->set_name("Бонифаций"); echo "Имя нового льва: ", $lion->name, "."; ?>
При выполнении данного кода будет выведено следующее сообщение об ошибке:
Fatal error: Cannot access private property Animal::$name in test.php on line 19
Наряду с приватными свойствами можно объявить и приватные методы класса. Например, метод get_name может быть объявлен как приватный:
<?php class Animal { var $name; function set_name ($text) { $this->name = $text; } private function get_name () { return $this->name; } } $lion = new Animal; $lion->set_name("Бонифаций"); echo "Имя нового льва: ", $lion->get_name (), "."; ?>
Fatal error: Call to private method Animal::get_name() from context '' in test.php on line 19
При использовании ключевого слова protected свойства и методы класса будут доступны только изнутри данного класса, а также из всех классов, порожденных на основе данного.
Автор: Стивен Хольцнер. Переводчик: С. Банников