
Reg.ru: домены и хостинг
Крупнейший регистратор и хостинг-провайдер в России.
Более 2 миллионов доменных имен на обслуживании.
Продвижение, почта для домена, решения для бизнеса.
Более 700 тыс. клиентов по всему миру уже сделали свой выбор.

Бесплатный Курс "Практика HTML5 и CSS3"
Освойте бесплатно пошаговый видеокурс
по основам адаптивной верстки
на HTML5 и CSS3 с полного нуля.

Фреймворк Bootstrap: быстрая адаптивная вёрстка
Пошаговый видеокурс по основам адаптивной верстки в фреймворке Bootstrap.
Научитесь верстать просто, быстро и качественно, используя мощный и практичный инструмент.
Верстайте на заказ и получайте деньги.
*Наведите курсор мыши для приостановки прокрутки.
Объектно-ориентированный подход в PHP для начинающих. Часть 3
Этот материал - продолжение статьи Объектно-ориентированный подход в PHP для начинающих. Часть 2.
Область видимости Свойств и Методов
Для дополнительного контроля над объектами, методам и свойствам можно задавать так называемую область видимости.
Этот параметр определяет, как и откуда можно получить доступ к определенным свойствам и методам. Существует три ключевых слова для задания видимости: public, protected и private. В дополнение к области видимости, метод или свойство могут быть объявлены как статические (static), что позволяет получать доступ к ним без создания экземпляра класса.
Свойства и Методы типа public
Все методы и свойства по умолчанию относятся к типу public. Это означает, что получить к ним доступ можно откуда угодно: как из класса, так и за пределами класса.
Свойства и Методы типа protected
Когда свойство или метод объявлены как protected, то доступ к ним можно получить только в пределах текущего класса, либо в потомках данного класса (т.е. в классах, которые расширяют класс, в котором находится protected-метод).
Объявите метод getProperty() как protected в классе MyClass и попытайтесь получить к нему доступ из-за пределов класса:
<?php class MyClass { public $prop1 = "Я - свойство класса!"; public function __construct() { echo 'Класс ' . __CLASS__ . ' был инстанцирован! (Был создан экземпляр класса)<br />'; } public function __destruct() { echo 'Объект уничтожен.<br />'; } public function __toString() { echo "Используем метод __toString(): "; return $this->getProperty(); } public function setProperty($newval) { $this->prop1 = $newval; } protected function getProperty() { return $this->prop1 . "<br />"; } } class MyOtherClass extends MyClass { public function __construct() { parent::__construct(); // Вызываем конструктор родительского класса (MyClass) echo "Новый конструктор из класса " . __CLASS__ . ".<br />"; } public function newMethod() { echo "Из нового метода в классе " . __CLASS__ . ".<br />"; } } // Создаем новый объект $newobj = new MyOtherClass; // Пытаемся вызвать protected-метод echo $newobj->getProperty(); ?>
При выполнении данного скрипта мы получим следующий результат:
Класс MyClass был инстанцирован! (Был создан экземпляр класса) Новый конструктор из класса MyOtherClass. Fatal error: Call to protected method MyClass::getProperty() from context '' in Z:\home\ooptest\www\index.php on line 53
Теперь давайте создадим новый метод в классе MyOtherClass для того, чтобы вызвать метод getProperty() и вызовем его из объекта newobj:
<?php class MyClass { public $prop1 = "Я - свойство класса!"; public function __construct() { echo 'Класс ' . __CLASS__ . ' был инстанцирован! (Был создан экземпляр класса)<br />'; } public function __destruct() { echo 'Объект уничтожен.<br />'; } public function __toString() { echo "Используем метод __toString(): "; return $this->getProperty(); } public function setProperty($newval) { $this->prop1 = $newval; } protected function getProperty() { return $this->prop1 . "<br />"; } } class MyOtherClass extends MyClass { public function __construct() { parent::__construct(); // Вызываем конструктор родительского класса (MyClass) echo "Новый конструктор из класса " . __CLASS__ . ".<br />"; } public function newMethod() { echo "Из нового метода в классе " . __CLASS__ . ".<br />"; } // данный метод вернет нам результат работы protected-метода getProperty() public function callProtected() { return $this->getProperty(); } } // Создаем новый объект $newobj = new MyOtherClass; // Вызываем protected-метод через public-метод echo $newobj->callProtected(); ?>
В результате выполнения такого кода мы получим ожидаемый результат:
Класс MyClass был инстанцирован! (Был создан экземпляр класса) Новый конструктор из класса MyOtherClass. Я - свойство класса! Объект уничтожен.
Свойства и Методы типа private
Если свойства или методы объявлены как private, то доступ к ним можно получить только из того класса, в котором они были объявлены. Это означает, что даже если у нас есть класс, расширяющий тот класс, в котором заданы private-методы или свойства, то из дочернего класса мы не сможем получить к ним доступ.
Для того, чтобы у этом убедиться, объявите метод getProperty() как private и попробуйте вызвать метод callProtected() из класса MyOtherClass:
<?php class MyClass { public $prop1 = "Я - свойство класса!"; public function __construct() { echo 'Класс ' . __CLASS__ . ' был инстанцирован! (Был создан экземпляр класса)<br />'; } public function __destruct() { echo 'Объект уничтожен.<br />'; } public function __toString() { echo "Используем метод __toString(): "; return $this->getProperty(); } public function setProperty($newval) { $this->prop1 = $newval; } private function getProperty() { return $this->prop1 . "<br />"; } } class MyOtherClass extends MyClass { public function __construct() { parent::__construct(); // Вызываем конструктор родительского класса (MyClass) echo "Новый конструктор из класса " . __CLASS__ . ".<br />"; } public function newMethod() { echo "Из нового метода в классе " . __CLASS__ . ".<br />"; } // данный метод вернет нам результат работы protected-метода getProperty() public function callProtected() { return $this->getProperty(); } } // Создаем новый объект $newobj = new MyOtherClass; // Вызываем protected-метод через public-метод echo $newobj->callProtected(); ?>
Перезагрузив страницу, мы увидим следующее:
Класс MyClass был инстанцирован! (Был создан экземпляр класса) Новый конструктор из класса MyOtherClass. Fatal error: Call to private method MyClass::getProperty() from context 'MyOtherClass' in Z:\home\ooptest\www\index.php on line 51
Статические Свойства и Методы
К методам или свойствам, объявленным как static, можно обратиться без создания экземпляра класса: мы просто указываем имя класса, ставим специальный оператор (::) и указываем метод (либо свойство), к которому хотим получить доступ.
Для демонстрации создадим статическое свойство count и статический метод plusOne() в классе MyClass. И за пределами класса воспользуемся циклом do while для вывода увеличивающегося значения счетчика в пределах 5:
<?php class MyClass { public $prop1 = "Я - свойство класса!"; public static $count = 0; public function __construct() { echo 'Класс ' . __CLASS__ . ' был инстанцирован! (Был создан экземпляр класса)<br />'; } public function __destruct() { echo 'Объект уничтожен.<br />'; } public function __toString() { echo "Используем метод __toString(): "; return $this->getProperty(); } public function setProperty($newval) { $this->prop1 = $newval; } private function getProperty() { return $this->prop1 . "<br />"; } public static function plusOne() { return "Счет: " . self::$count++ . "<br />"; } } class MyOtherClass extends MyClass { public function __construct() { parent::__construct(); // Вызываем конструктор родительского класса (MyClass) echo "Новый конструктор из класса " . __CLASS__ . ".<br />"; } public function newMethod() { echo "Из нового метода в классе " . __CLASS__ . ".<br />"; } // данный метод вернет нам результат работы protected-метода getProperty() public function callProtected() { return $this->getProperty(); } } do { // Вызываем метод plusOne() без создания экземпляра класса echo MyClass::plusOne(); } while (MyClass::$count < 5); ?>
После перазагрузки страницы получим результат:
Счет: 0 Счет: 1 Счет: 2 Счет: 3 Счет: 4
Комментирование DocBlocks
Стиль комментирования DocBlock отличается использованием дополнительной звездочки в начале блока комментариев.
Не будучи официальным стандартом комментирования, такой стиль получил все же широкое распространение для документирования классов:
/** * Простейший пример DocBlock */
Основная идея комментирования в стиле DocBlock - это применение тэгов, которые начинаются с символа (@). Эти тэги позволяют разработчикам указать автора файла, информацию о свойствах и методах и другие полезные данные.
Наиболее популярные тэги перечислены ниже:
- @author: Автор текущего элемента (класса, файла, метода и т.п.). Часто используется несколько таких тэгов в пределах одного блока комментариев, если необходимо уазать несколько разных разработчиков. Формат: Ivan Petrov <ivan.petrov@email.com>
- @copyright: Данный тэг позволяет указать авторские права. Формат: 2011 Ivan Petrov
- @license: Данный тэг дает ссылку на лицензию к текущему элементу. Формат: http://www.example.com/path/to/license.txt PHP License 3.01
- @var: Здесь содержится описание переменной (либо свойства класса). Формат: string хранит информацию для класса.
- @param: В этом тэге указывается тип и описание параметра для функции (либо метода в классе). Формат: int $element число для умножения.
- @return: В этом тэге указывается тип возвращаемого функцией (либо методом в классе) значения. Формат: int результат перемножения.
В качестве примера использования можно привести следующий код:
<?php /** * Простой класс * * Это длинное описание для класса, которе может * занимать столько линий, сколько потребуется. * Оно не обязательно, однако краткое описание * всегда приветствуется. * * Также данное описание может состоять хоть из * нескольких параграфов для удобства восприятия. * * @author Ivan Petrov <ivan.petrov@email.com> * @copyright 2011 Ennui Design * @license http://www.php.net/license/3_01.txt PHP License 3.01 */ class SimpleClass { /** * A public variable * * @var string хранит информацию для класса */ public $foo; /** * Устанавливает значение для $foo во время создания экземляра класса * * @param string $val значение, необходимое для класса * @return void */ public function __construct($val) { $this->foo = $val; } /** * Перемножает два целых числа * * Принимает два целых числа и возвращает * результат их перемножения. * * @param int $bat число для перемножения * @param int $baz число для перемножения * @return int результат перемножения */ public function bar($bat, $baz) { return $bat * $baz; } } ?>
После того как Вы пробежитесь взглядом по данному классу, преимущества комментирования в стиле DocBlock становится очевидны: все четко определено и расписано, так что следующий разработчик может легко продолжить работать с этим кодом без необходимости вникать в то, что же происходит в каждой конкретной функции, что должно содержаться в каждой из переменных и т.п.
По материалам net.tutsplus.com
Перевод - Дмитрий Науменко.
P.S. Хотите двигаться дальше в освоении PHP и ООП? Обратите внимание на премиум-уроки по различным аспектам сайтостроения, включая программирование на PHP, а также на бесплатный курс по созданию своей CMS-системы на PHP с нуля с использованием ООП:
Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!
Смотрите также: