Reg.ru: домены и хостинг

Крупнейший регистратор и хостинг-провайдер в России.

Более 2 миллионов доменных имен на обслуживании.

Продвижение, почта для домена, решения для бизнеса.

Более 700 тыс. клиентов по всему миру уже сделали свой выбор.

Перейти на сайт->

Бесплатный Курс "Практика HTML5 и CSS3"

Освойте бесплатно пошаговый видеокурс

по основам адаптивной верстки

на HTML5 и CSS3 с полного нуля.

Начать->

Фреймворк Bootstrap: быстрая адаптивная вёрстка

Пошаговый видеокурс по основам адаптивной верстки в фреймворке Bootstrap.

Научитесь верстать просто, быстро и качественно, используя мощный и практичный инструмент.

Верстайте на заказ и получайте деньги.

Получить в подарок->

Бесплатный курс "Сайт на WordPress"

Хотите освоить CMS WordPress?

Получите уроки по дизайну и верстке сайта на WordPress.

Научитесь работать с темами и нарезать макет.

Бесплатный видеокурс по рисованию дизайна сайта, его верстке и установке на CMS WordPress!

Получить в подарок->

*Наведите курсор мыши для приостановки прокрутки.


Объектно-ориентированный подход в 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 с нуля с использованием ООП:

Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!


Смотрите также:

PHP: Получение информации об объекте или классе, методах, свойствах и наследовании

PHP: Получение информации об объекте или классе, методах, свойствах и наследовании

CodeIgniter: жив или мертв?

CodeIgniter: жив или мертв?

Функции обратного вызова, анонимные функции и механизм замыканий

Функции обратного вызова, анонимные функции и механизм замыканий

Применение функции к каждому элементу массива

Применение функции к каждому элементу массива

Слияние массивов. Преобразование массива в строку

Слияние массивов. Преобразование массива в строку

Деструктор и копирование объектов с помощью метода __clone()

Деструктор и копирование объектов с помощью метода __clone()

Эволюция веб-разработчика или Почему фреймворк - это хорошо?

Эволюция веб-разработчика или Почему фреймворк - это хорошо?

Магические методы в PHP или методы-перехватчики (сеттеры, геттеры и др.)

Магические методы в PHP или методы-перехватчики (сеттеры, геттеры и др.)

PHP: Удаление элементов массива

PHP: Удаление элементов массива

Ключевое слово final (завершенные классы и методы в PHP)

Ключевое слово final (завершенные классы и методы в PHP)

50 классных сервисов, программ и сайтов для веб-разработчиков

50 классных сервисов, программ и сайтов для веб-разработчиков

Наверх