Объектно-ориентированный подход в 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-методы или свойства, то из дочернего класса мы не сможем получить к ним доступ.
— Регулярная проверка качества ссылок по более чем 100 показателям и ежедневный пересчет показателей качества проекта.
— Все известные форматы ссылок: арендные ссылки, вечные ссылки, публикации (упоминания, мнения, отзывы, статьи, пресс-релизы).
— SeoHammer покажет, где рост или падение, а также запросы, на которые нужно обратить внимание.
SeoHammer еще предоставляет технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Зарегистрироваться и Начать продвижение
Для того, чтобы у этом убедиться, объявите метод 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 с нуля с использованием ООП:
Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!
Смотрите также:

















