Скрипты

ticket-plus-система-технической-поддержки-клиентов  - позволяет вам легко масштабировать и оптимизировать обслуживание клиентов и значительно улучшать положительное отношение ваших клиенов. Ticket...
phpsound-1-2-7-платформа-обмена-музыкойPhpSound - это социальная платформа обмена музыкальными файлами, похожей на soundcloud. Сервис даёт пользователям возмоность загружать свою музыку, и...
wowonder-v-1-3-социальная-сетевая-платформа WoWonder - это PHP-скрипт социальной сети, WoWonder это лучший способ чтобы начать создание собственного сайта социальной сети. Этот скрипт имеет все...

Для Photoshop

animation-glitch-photoshop-action Action для программы Photoshop, который генерирует видео ряд анимационных эффектов в виде помех на экране, из ваших изображений. Вы можете создать...
radiant-action-photoshop Экшен для программы Photoshop, создаёт эффект света и геометрических фигур, что поможет создать стильный модный вид вашему образу. Создавайте яркие и...
doomsday-action-экшен-для-photoshop Экшен для программы Photoshop, создаёт потрясающий эффект драматизма с глубокими тенями и световым контрактом. Отлично подойдёт при создании рекламных...

Что такое ООП объектно ориентированное программирование

200

Объектно-ориентированное программирование — это стиль кодирования, который позволяет разработчику группировать схожие задачи в классы. Таким образом код соответствует принципу DRY (don't repeat yourself – не повторяй самого себя) и становится лёгким для сопровождения.

Одним из преимуществ DRY программирования является то, что если некоторая информация требует изменения вашей программы, то нужно изменять код лишь в одном месте, чтобы обновить алгоритм.

Одним из самых страшных ночных кошмаров разработчика является сопровождение кода, в котором данные объявляются снова и снова, что превращает любые изменения в программе в бесконечную игру «прятки», в ходе которой приходится охотиться на повторяющиеся данные и куски алгоритма.

ООП пугает многих разработчиков, потому что оно вводит новый синтаксис и, на первый взгляд, кажется более сложным, чем простое процедурное кодирование. Однако, при более тщательном ознакомлении, ООП оказывается в действительности очень чётким и чрезвычайно простым подходом к программированию.

Что такое объекты и классы

Прежде, чем погрузиться в чёткие определения ООП, необходимо составить общее представление о разнице между классами и объектами. Данный раздел статьи поможет составит представление о классах, их различных возможностях и некоторых применениях.

В чем заключается разница между классами и объектами

Разработчики, начиная разговаривать о классах и объектах, начинают подменять понятия. К сожалению, такое очень часто происходит.

Класс, например, это проект дома. Он определяет на бумаге как будет выглядеть дом, чётко описывает все взаимосвязи между его различными частями, даже если дом не существует в реальности.

А объект — это реальный дом, который построен в соответствии с проектом. Данные, которые хранятся в объекте похожи на дерево, провода и бетон, из которых построен дом: без сборки в соответствии с проектом, они будут всего лишь кучей материалов . Однако, собранные вместе они становятся отличным и удобным домом.

Классы формируют структуру данных и действий и используют эту информацию для строительства объектов. Из одного класса может быть построено более одного объекта в одно и тоже время, каждый из них будет независим от других. Продолжая аналогию со строительством, целый район может быть построен по одному проекту: 150 различных домов, которые выглядят одинаково, но в каждом из них живут разные семьи и внутренняя отделка строений разная.

Структура класса

Синтаксис для создания класса очень прост: для объявления класса используется ключевое слово class, за которым следует имя класса и набор фигурных скобок ({}):

<?php

class MyClass
{
// Свойства и методы класса
}

?>

После создания класса, новый объект может быть реализован и сохранен в переменной с использованием ключевого слова new:

$obj = new MyClass;

Чтобы увидеть содержимое объекта, используйте var_dump():

var_dump($obj);

 

Можно протестировать весь процесс, скопировав весь код в файл test.php :

object(MyClass)#1 (0) { }

 

Вы только что создали свой первый скрипт ООП.

 

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

Свойства, или переменные класса, используются для того, чтобы добавить данные в класс. Свойства работают как обычные переменные, но они связаны с объектом, и к ним можно получить доступ только используя объект.

Чтобы добавить свойства классу MyClass, используйте такой код в вашем скрипте:

<?php
 
class MyClass
{
public $prop1 = "Свойство класса ";
}
 
$obj = new MyClass;
 
var_dump($obj);
 
?>

 

Ключевое слово public определяет видимость свойства, мы расскажем о нем чуть позже в данной главе. Затем свойство именуется с использованием обычного синтаксиса для переменных, и ему присваивается значение (хотя свойство класса не нуждается в инициализации).

Чтобы прочитать значение свойства и вывести его в браузере, нужно сослаться на объект, из которого будет производиться чтение:

<?php
 
class MyClass
{
public $prop1 = "Свойство класса ";
}
 
$obj = new MyClass;
 
echo $obj->prop1; // Выводим свойство
 
?>

Обновите страницу в вашем браузере, чтобы увидеть результат работы скрипта:

Свойство класса

 

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

Метод — это функция класса. Индивидуальное действие, которое может выполнить объект, определяется в классе как метод.

Например, создадим методы, которые устанавливают и читают значение свойства $prop1:

<?php
 
class MyClass
{
public $prop1 = "Свойство класса ";
 
public function setProperty($newval)
{
$this->prop1 = $newval;
}
 
public function getProperty()
{
return $this->prop1 . "<br />";
}
}
 
$obj = new MyClass;
 
echo $obj->prop1;
 
?>

 

Примечание — ООП позволяет объекту ссылаться на самого себя, используя $this. При работе внутри метода, использование $this позволяет использовать имя объекта вне класса.

Чтобы использовать метод, вызовите его как обычную функцию, но сначала укажите объект, которому она принадлежит. Читаем свойство из MyClass, изменяем значение, читаем его снова:

<?php
 
class MyClass
{
public $prop1 = "Свойство класса ";
 
public function setProperty($newval)
{
$this->prop1 = $newval;
}
 
public function getProperty()
{
return $this->prop1 . "<br />";
}
}
 
$obj = new MyClass;
 
echo $obj->getProperty(); // получаем значение свойства
 
$obj->setProperty("Новое свойство."); // Устанавливаем новое значение
 
echo $obj->getProperty(); // Снова читаем значение, чтобы увидеть изменения
 
?>

Обновляем страницу в браузере и видим следующее:

Свойство класса
Новое свойство

Преимущества ООП проявляются при использовании множества объектов одного класса.

<?php
 
class MyClass
{
public $prop1 = "Свойство класса ";
 
public function setProperty($newval)
{
$this->prop1 = $newval;
}
 
public function getProperty()
{
return $this->prop1 . "<br />";
}
}
 
// Создаем два объекта
$obj = new MyClass;
$obj2 = new MyClass;
 
// Получаем значения $prop1 из обоих объектов
echo $obj->getProperty();
echo $obj2->getProperty();
 
// Устанавливаем новые значения свойств для обоих объектов
$obj->setProperty("Новое значение свойства");
$obj2->setProperty("Свойство принадлежит второму объекту");
 
// Выводим значения $prop1 для обоих
echo $obj->getProperty();
echo $obj2->getProperty();
 
?>

 

Когда вы загрузите страницу в браузер, то увидите следующее:

Свойство класса
Свойство класса
Новое значение свойства
Свойство принадлежит второму объекту

 

 

 

Обратите внимание, ООП сохраняет объекты как различные сущности, что позволяет легко разделять код на различные маленькие и взаимосвязанные части.

Магические методы в ООП

Чтобы сделать использование объектов проще, PHP имеет несколько магических методов. Это специальные методы, которые вызываются, когда над объектом производятся определённые действия. Таким образом разработчик может выполнить несколько общих задач с относительно просто.

Использование конструкторов и деструкторов

Когда создаётся объект, очень часто нужно, чтобы при этом сразу производились установки некоторых свойств. Для выполнения таких задач PHP имеет магический метод __construct(), который вызывается автоматически при создании нового объекта.

Для иллюстрации концепции, добавим конструктор к классу MyClass. Он будет выводить сообщение при создании нового объекта класса:

<?php
 
class MyClass
{
public $prop1 = "Свойство класса ";
 
public function __construct()
{
echo 'Создан объект класса "', __CLASS__, '"!<br />';
}
 
public function setProperty($newval)
{
$this->prop1 = $newval;
}
 
public function getProperty()
{
return $this->prop1 . "<br />";
}
}
 
// Создаем новый объект
$obj = new MyClass;
 
// Получаем значение свойства $prop1
echo $obj->getProperty();
 
// Выводим сообщение о достижении конца файла
echo "Конец файла.<br />";
 
?>

 

Примечание — константа __CLASS__ возвращает имя класса, в котором она вызывается; это одна из магических констант PHP.

Обновляем страницу в браузере и получаем результат:

Создан объект класса "MyClass"!
Свойство класса
Конец файла.

Для вызова функции в процессе удаления объекта используется магический метод __destruct(). Это очень полезный метод для корректной очистки свойств класса (например, для правильного закрытия соединения с базой данных).

Выведем сообщение, когда будет удаляться объект класса, с помощью магического метода:
__destruct() in MyClass:

<?php
 
class MyClass
{
public $prop1 = "Свойство класса ";
 
public function __construct()
{
echo 'Создан объект класса "', __CLASS__, '"!<br />';
}
 
public function __destruct()
{
echo 'Объект класса "', __CLASS__, '" удален.<br />';
}
 
public function setProperty($newval)
{
$this->prop1 = $newval;
}
 
public function getProperty()
{
return $this->prop1 . "<br />";
}
}
 
// Создаём новый объект
$obj = new MyClass;
 
// Получаем значение свойства $prop1
echo $obj->getProperty();
 
// Выводим сообщение о достижении конца файла
echo "Конец файла.<br />";
 
?>

Обновляем страницу в браузере и получаем результат:

 

Создан объект класса "MyClass"!
Свойство класса
Конец файла.
Объект класса "MyClass" удален.

При достижении конца файла PHP автоматически освобождает все ресурсы.

Для явного вызова деструктора и удаления объекта Вы можете использовать функцию unset():

<?php
 
class MyClass
{
public $prop1 = "Свойство класса ";
 
public function __construct()
{
echo 'Создан объект класса "', __CLASS__, '"!<br />';
}
 
public function __destruct()
{
echo 'Объект классса "', __CLASS__, '" удален.<br />';
}
 
public function setProperty($newval)
{
$this->prop1 = $newval;
}
 
public function getProperty()
{
return $this->prop1 . "<br />";
}
}
 
// Создаем новый объект
$obj = new MyClass;
 
// Получаем значение свойства $prop1
echo $obj->getProperty();
 
// Удаляем объект
unset($obj);
 
// Выводим сообщение о достижении конца файла
echo "Конец файла.<br />";
 
?>

 

Теперь результат работы кода будет выглядеть после загрузки в браузер следующим образом:

 

 

Создан объект класса "MyClass"!
Свойство класса
Объект класса "MyClass" удален.
Конец файла.

Преобразование в строку

Чтобы избежать ошибки, если скрипт попытается вывести MyClass как строку, используется другой магический метод __toString().

Без использования __toString() попытка вывести объект как строку приведёт к фатальной ошибке. Попробуйте использовать функцию echo, чтобы вывести объект без применения магического метода:

<?php
 
class MyClass
{
public $prop1 = "Свойство класса ";
 
public function __construct()
{
echo 'Создан объект класса "', __CLASS__, '"!<br />';
}
 
public function __destruct()
{
echo 'Объект классса "', __CLASS__, '" удален.<br />';
}
 
public function setProperty($newval)
{
$this->prop1 = $newval;
}
 
public function getProperty()
{
return $this->prop1 . "<br />";
}
}
 
// Создаем новый объект
$obj = new MyClass;
 
// Выводим объект как строку
echo $obj;
 
// Удаляем объект
unset($obj);
 
// Выводим сообщение о достижении конца файла
echo "Конец файла.<br />";
 
?>

Результат работы будет выглядеть следующим образом:

 

 

 

Создан объект класса "MyClass"!

Catchable fatal error: Object of class MyClass could not be converted to string in /Applications/XAMPP/xamppfiles/htdocs/testing/test.php on line 40

Чтобы избежать ошибки, используйте метод __toString():

<?php
 
class MyClass
{
public $prop1 = "Свойство класса ";
 
public function __construct()
{
echo 'Создан объект класса "', __CLASS__, '"!<br />';
}
 
public function __destruct()
{
echo 'Объект классса "', __CLASS__, '" удален.<br />';
}
 
public function __toString()
{
echo "Используем метод toString: ";
return $this->getProperty();
}
 
public function setProperty($newval)
{
$this->prop1 = $newval;
}
 
public function getProperty()
{
return $this->prop1 . "<br />";
}
}
 
// Создаем новый объект
$obj = new MyClass;
 
// Выводим объект как строку
echo $obj;
 
// Удаляем объект
unset($obj);
 
// Выводим сообщение о достижении конца файла
echo "Конец файла.<br />";
 
?>

 

В этом случае попытка конвертировать объект в строку приведёт к вызову метода getProperty(). Загружаем скрипт в браузер и смотрим на результат работы:

 

 

Создан объект класса "MyClass"!
Используем метод toString: Свойство класса
Объект класса "MyClass" удален.
Конец файла.

Подсказка — В дополнение к магическим методам, которые использовались в данном разделе, существует ещё несколько полезных функций. Чтобы получить полный список с=магических методов смотрите руковдство по PHP.

 

 

Использование наследования классов

Классы могут наследовать методы и свойства от других классов с помощью ключевого слова extends. Например, создадим второй класс, который расширяет возможности MyClass и добавляет метод:

<?php
 
class MyClass
{
public $prop1 = "Свойство класса ";
 
public function __construct()
{
echo 'Создан объект класса "', __CLASS__, '"!<br />';
}
 
public function __destruct()
{
echo 'Объект классса "', __CLASS__, '" удален.<br />';
}
 
public function __toString()
{
echo "Используем метод toString: ";
return $this->getProperty();
}
 
public function setProperty($newval)
{
$this->prop1 = $newval;
}
 
public function getProperty()
{
return $this->prop1 . "<br />";
}
}
 
class MyOtherClass extends MyClass
{
public function newMethod()
{
echo "Из нового метода класса " . __CLASS__ . ".<br />";
}
}
 
// Создаем новый объект
$newobj = new MyOtherClass;
 
// Используем новый метод
echo $newobj->newMethod();
 
// Используем метод из родительского класса
echo $newobj->getProperty();
 
?>

 

 

После загрузки скрипта в браузер получим результат:

Создан объект класса "MyClass"!
Из нового метода класса "MyOtherClass".
Свойство класса
Объект класса "MyClass" удален.

Перегрузка унаследованных свойств и методов

Чтобы изменить поведение существующих свойств или методов в новом классе, вы можете просто перегрузить их с помощью повторного объявления в новом классе:

<?php
 
class MyClass
{
public $prop1 = "Свойство класса ";
 
public function __construct()
{
echo 'Создан объект класса "', __CLASS__, '"!<br />';
}
 
public function __destruct()
{
echo 'Объект классса "', __CLASS__, '" удален.<br />';
}
 
public function __toString()
{
echo "Используем метод toString: ";
return $this->getProperty();
}
 
public function setProperty($newval)
{
$this->prop1 = $newval;
}
 
public function getProperty()
{
return $this->prop1 . "<br />";
}
}
 
class MyOtherClass extends MyClass
{
public function __construct()
{
echo "Новый конструктор в классе " . __CLASS__ . ".<br />";
}
 
public function newMethod()
{
echo "Из нового метода класса " . __CLASS__ . ".<br />";
}
}
 
// Создаем новый объект
$newobj = new MyOtherClass;
 
// Выводим объект как строку
echo $newobj->newMethod();
 
// Используем метод из родительского класса
echo $newobj->getProperty();
 
?>

 

Изменения приведут к следующему выводу при выполнении кода:

 

Новый конструктор в классе "MyOtherClass".
Из нового метода класса "MyOtherClass".
Свойство класса
Объект класса "MyClass" удален.

Сохранение оригинальной функциональности при перегрузке методов

Чтобы добавить новую функциональность к унаследованному методу при сохранении функций оригинального метода, используйте ключевое слово parent с оператором разрешения видимости (::):

<?php
 
class MyClass
{
public $prop1 = "Свойство класса ";
 
public function __construct()
{
echo 'Создан объект класса "', __CLASS__, '"!<br />';
}
 
public function __destruct()
{
echo 'Объект классса "', __CLASS__, '" удален.<br />';
}
 
public function __toString()
{
echo "Используем метод toString: ";
return $this->getProperty();
}
 
public function setProperty($newval)
{
$this->prop1 = $newval;
}
 
public function getProperty()
{
return $this->prop1 . "<br />";
}
}
 
class MyOtherClass extends MyClass
{
public function __construct()
{
parent::__construct(); // Вызываем конструктор родительского класса
echo "Новый конструктор в классе " . __CLASS__ . ".<br />";
}
 
public function newMethod()
{
echo "Из нового метода класса " . __CLASS__ . ".<br />";
}
}
 
// Создаем новый объект
$newobj = new MyOtherClass;
 
// Выводим объект как строку
echo $newobj->newMethod();
 
// Используем метод из родительского класса
echo $newobj->getProperty();
 
?>

 

Выше приведённый код при выполнении выведет на экран сообщения из обеих конструкторов нового и родительского класса:

Создан объект класса "MyClass"!
Новый конструктор в классе "MyOtherClass".
Из нового метода класса "MyOtherClass".
Свойство класса
Объект класса "MyClass" удален.

Определение области видимости свойств и методов

Для дополнительного контроля над объектами, методами и свойствами устанавливается область видимости. Таким образом контролируется как и откуда могут быть доступны свойства и методы. Существует три ключевых слова для установки области видимости: public, protected, и private. В дополнение к установке области видимости, методы и свойства могут быть объявлены как static, что позволяет получать к ним доступ без реализации класса.

Примечание — Область видимости — это новое свойство, которое было введено в PHP 5. чтобы узнать о совместимости ООП с PHP 4, смотрите руководство по использованию PHP.

Свойства и методы public (Общие)

Все свойства и методы, которые вы использовали ранее в данной статье были public (общими). Это значит, что доступ к ним можно было получить где угодно, как внутри класса, так и вне класса..

Методы и свойства protected (Защищённые)

Когда свойство или метод объявляется с директивой protected, оно может быть доступно только внутри самого класса или внутри производных классов (классов, которые расширяют базовый класс, содержащий метод с директивой protected).

Объявим метод getProperty()как protected в MyClass и попробуем получить доступ к нему вне класса:

<?php
 
class MyClass
{
public $prop1 = "Свойство класса ";
 
public function __construct()
{
echo 'Создан объект класса "', __CLASS__, '"!<br />';
}
 
public function __destruct()
{
echo 'Объект классса "', __CLASS__, '" удален.<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();
echo "Новый конструктор в классе " . __CLASS__ . ".<br />";
}
 
public function newMethod()
{
echo "Из нового метода класса " . __CLASS__ . ".<br />";
}
}
 
// Создаем новый объект
$newobj = new MyOtherClass;
 
// Пробуем вызвать защищенный метод
echo $newobj->getProperty();
 
?>

 

При попытке выполнить скрипт, будет сгенерирована следующая ошибка:

Создан объект класса "MyClass"!
Новый конструктор в классе "MyOtherClass".

Fatal error: Call to protected method MyClass::getProperty() from context '' in /Applications/XAMPP/xamppfiles/htdocs/testing/test.php on line 55

Теперь, создадим новый метод в MyOtherClass для вызова метода getProperty():

<?php
 
class MyClass
{
public $prop1 = "Свойство класса ";
 
public function __construct()
{
echo 'Создан объект класса "', __CLASS__, '"!<br />';
}
 
public function __destruct()
{
echo 'Объект классса "', __CLASS__, '" удален.<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();
echo "Новый конструктор в классе " . __CLASS__ . ".<br />";
}
 
public function newMethod()
{
echo "Из нового метода класса " . __CLASS__ . ".<br />";
}
 
public function callProtected()
{
return $this->getProperty();
}
}
 
// Создаём новый объект
$newobj = new MyOtherClass;
 
// Вызываем защищённый метод из общего метода
echo $newobj->callProtected();
 
?>

 

Методы и свойства private (Частные)

Свойства и методы, объявленные с директивой private, доступны только внутри класса, в котором они определены. Это означает, что даже если новый класс будет производным от класса, в котором определены частные свойства и методы, они не будут доступны в производном классе.

Для демонстрации объявим метод getProperty() как private в MyClass, и попробуем вызвать метод callProtected() из
MyOtherClass:

<?php
 
class MyClass
{
public $prop1 = "Свойство класса ";
 
public function __construct()
{
echo 'Создан объект класса "', __CLASS__, '"!<br />';
}
 
public function __destruct()
{
echo 'Объект классса "', __CLASS__, '" удален.<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();
echo "Новый конструктор в классе " . __CLASS__ . ".<br />";
}
 
public function newMethod()
{
echo "Из нового метода класса " . __CLASS__ . ".<br />";
}
 
public function callProtected()
{
return $this->getProperty();
}
}
 
// Создаём новый объект
$newobj = new MyOtherClass;
 
// Используем метод из родительского класса
echo $newobj->callProtected();
 
?>

 

сохраняем скрипт, обновляем страницу в браузере и получаем следующее:

Создан объект класса "MyClass"!
Новый конструктор в классе "MyOtherClass".

Fatal error: Call to private method MyClass::getProperty() from context 'MyOtherClass' in /Applications/XAMPP/xamppfiles/htdocs/testing/test.php on line 49

Методы и свойства Static (статические)

Методы и свойства, объявленные с директивой static могут быть доступны без инициации класса. Вы просто используете имя класса, оператор разрешения видимости и имя свойства или метода.

Одним из основных преимуществ статических свойств является то, что они сохраняют свои значения на протяжении работы всего скрипта.

Для демонстрации добавим статическое свойство $count и статический метод plusOne() к классу MyClass. Затем установим цикл do...while для вывода увеличивающего значения $count, до тех пор пока оно не станет больше 10:

<?php
 
class MyClass
{
public $prop1 = "Свойство класса ";
 
public static $count = 0;
 
public function __construct()
{
echo 'Создан объект класса "', __CLASS__, '"!<br />';
}
 
public function __destruct()
{
echo 'Объект классса "', __CLASS__, '" удален.<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 "count = " . ++self::$count . ".<br />";
}
}
 
class MyOtherClass extends MyClass
{
public function __construct()
{
parent::__construct();
echo "Новый конструктор в классе " . __CLASS__ . ".<br />";
}
 
public function newMethod()
{
echo "Из нового метода класса " . __CLASS__ . ".<br />";
}
 
public function callProtected()
{
return $this->getProperty();
}
}
 
do
{
// Вызываем plusOne без инициации класса MyClass
echo MyClass::plusOne();
} while ( MyClass::$count < 10 );
 
?>

 

Примечание — Для доступа к статическим свойствам знак доллара ($) должен стоять после оператора разрешения выидимости.

Выполнение скрипта в браузере выдаст следующий результат:

count = 1.
count = 2.
count = 3.
count = 4.
count = 5.
count = 6.
count = 7.
count = 8.
count = 9.
count = 10.

Комментирование с помощью DocBlock

Не являясь официальной частью ООП, комментирование в стиле DocBlock широко используется как метод документирования классов. Кроме того, оно адаптировано для многих популярных пакетов разработчиков, таких как Eclipse и NetBeans, и используется для генерации описания кода.

DocBlock определяется с помощью блочного комментария, который имеет в начале дополнительную звездочку:

/**
* Это базовый DocBlock
*/

Действительная мощность DocBlocks открывается при использовании тегов, которые начинаются с символа (@) за которым без пробелов следует имя тега и значение. Теги DocBlock позволяют разработчику определять автора файла, лицензию на использование класса, информацию о свойствах и методах, а также много другой полезной информации о коде.

Наиболее популярные теги:

  • @author: автор текущего элемента (который может быть классом, файлом, методом, или частью кода). В одном DocBlock могут быть указаны несколько авторов. Формат имени автора: Джони Doe <ДжониЭтот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.>.

  • @copyright: Тег указывает год и владельца копирайта на текущий элемент. Формат: 2010 Владелец копирайта.

  • @license: Ссылка на тип лицензии текущего элемента. Формат:
    http://www.example.com/path/to/license.txt Название лицензии.

  • @var: Содержит тип и описание переменной или метода класса. Формат: тип элемент описание.

  • @param: Содержит тип и описание параметров функции или метода. Формат: тип $элемент описание элемента.

  • @return: Тип и описание возвращаемого значения для функции или метода. Формат: тип возвращаемое_значение описание.

Простой класс с комментариями в стиле DocBlocks может выглядеть так::

<?php
 
/**
* Простой класс
*
* Это длинное описание данного класса,
* которое может быть продолжено настолько, на сколько нужно.
*
* Оно также может быть расширенно несколькими параграфами,
* если описание стало слишком многословным.
*
* @author Jason Lengstorf <Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.>
* @copyright 2010 Ennui Design
* @license http://www.php.net/license/3_01.txt PHP License 3.01
*/

class SimpleClass
{
/**
* Переменные public
*
* @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 очевидны: все чётко определено, так что другой разработчик может легко разобраться в коде.

Сравнение объектно-ориентированного и процедурного программирования

Нет правильного и ошибочного стиля программирования. Данный раздел описывает сильные аргументы в пользу использования объектно-ориентированного программирования для разработки программного обеспечения, особенно при реализации крупных проектов.

Аргумент 1: простота применения

Не смотря на то, что ООП сначала приводит в растерянность, оно в действительности обеспечивает более простой подход ля работы с данными. Так как объект может хранить данные внутри себя, то нет необходимости предавать переменные от функции к функции для корректной работы.

Также, благодаря тому, что множественные реализации одного класса могут существовать одновременно, работа с большими наборами данных становится очень простой. Например, представим что у вас для обработки есть файл с информацией о двух людях. Нужно обрабатывать их имена, род деятельности и возраст.

Процедурный подход

Ниже приводится процедурный подход для нашего примера:

<?php
 
function changeJob($person, $newjob)
{
$person['job'] = $newjob; // Изменяем место работы для человека
return $person;
}
 
function happyBirthday($person)
{
++$person['age']; // Добавляем 1 к возрасту человека
return $person;
}
 
$person1 = array(
'name' => 'Томми',
'job' => 'Старший нажиматель кнопки',
'age' => 34
);
 
$person2 = array(
'name' => 'Джони',
'job' => 'Тянутель большого рычага',
'age' => 41
);
 
// Выводим начальные значения информации о людях
echo "<pre> Человек 1: ", print_r($person1, TRUE), "</pre>";
echo "<pre> Человек 2: ", print_r($person2, TRUE), "</pre>";
 
// Томми получил повышение и у него день рождения
$person1 = changeJob($person1, 'Главный двигатель коробочек');
$person1 = happyBirthday($person1);
 
// У Джони только день рождения (повысят в другой раз)
$person2 = happyBirthday($person2);
 
// Выводим новый значения информации о людях
echo "<pre> Человек 1: ", print_r($person1, TRUE), "</pre>";
echo "<pre> Человек 2: ", print_r($person2, TRUE), "</pre>";
 
?>

 

Выполнение кода приведёт к следующему результату:

Человек
(
[name] => Томми
[job] => Старший нажиматель кнопки
[age] => 34
)
Человек 2: Array
(
[name] => Джони
[job] => Тянутель большого рычага
[age] => 41
)
Человек 1: Array
(
[name] => Томми
[job] => Главный двигатель коробочек
[age] => 35
)
Человек 2: Array
(
[name] => Джони
[job] => Тянутель большого рычага
[age] => 42
)
Не смотря на то, что такой код может быть и отличным, разработчику приходится слишком много моментов держать в памяти. <strong>Массив атрибутов каждой персоны должен быть передан в процедуру и возвращён из неё при каждом вызове,</strong> что составляет обширное поле для ошибок.

Желательно, чтобы для разработчика оставалось как можно меньше мест для ошибок. Только действительно нужная информация для конкретной операции должна передаваться в функции.

Подход ООП

Вот подход ООП для решения нашего примера:

<?php
 
class Person
{
private $_name;
private $_job;
private $_age;
 
public function __construct($name, $job, $age)
{
$this->_name = $name;
$this->_job = $job;
$this->_age = $age;
}
 
public function changeJob($newjob)
{
$this->_job = $newjob;
}
 
public function happyBirthday()
{
++$this->_age;
}
}
 
// Создаем двух новых людей
$person1 = new Person("Томми", "Старший нажиматель кнопки", 34);
$person2 = new Person("Джони", "Тянутель большого рычага", 41);
 
// Выводим начальную информацию о них
echo "<pre> Человек 1: ", print_r($person1, TRUE), "</pre>";
echo "<pre> Человек 2: ", print_r($person2, TRUE), "</pre>";
 
// Даем Томми повышение и устанавливаем день рождения
$person1->changeJob("Главный двигатель коробочек");
$person1->happyBirthday();
 
// Джони будет праздновать только день рождения
$person2->happyBirthday();
 
// Выводим окончательную информацию о людях
echo "<pre> Человек 1: ", print_r($person1, TRUE), "</pre>";
echo "<pre> Человек 2: ", print_r($person2, TRUE), "</pre>";
 
?>

 

Данный код выдаст следующий результат:

Person 1: Person Object
(
[_name:private] => Томми
[_job:private] => Старший нажиматель кнопки
[_age:private] => 34
)

Person 2: Person Object
(
[_name:private] => Джони
[_job:private] => Тянутель большого рычага
[_age:private] => 41
)

Person 1: Person Object
(
[_name:private] => Томми
[_job:private] => Главный двигатель коробочек
[_age:private] => 35
)

Person 2: Person Object
(
[_name:private] => Джони
[_job:private] => Тянутель большого рычага
[_age:private] => 42
)

В данном случае немного больше кода используется для реализации, но как только классы определены, создание и модификация данных о людях выполняется легко и непринуждённо. Информацию о человеке не нужно предавать или возвращать из метода, в каждый метод передаётся только то, что нужно.

В проектах маленького масштаба разница может показаться очень маленькой. Но как только проект начинает расти в размерах, ООП существенно уменьшает нагрузку на разработчика, если применяется правильно.

ПодсказкаВ ООП нуждается далеко не все. Быстрые маленькие функции, которые обрабатывают что-то нибудь обычно не нуждаются в организации класса. Используйте разумный подход при выборе между ООП и процедурным подходом.

Аргумент 2: лучшая организация

Другим преимуществом ООП является то, насколько хорошо код получается организованным для создания пакетов разработчика и каталогов. Каждый класс можно хранить в отдельном файле. А если используется унификация имён классов, то доступ к классу становится чрезвычайно простым.

Предположим у вас есть приложение со 150 классами, которые получают имена динамически с помощью контрольного файла в корне вашего приложения. Все 150 классов используют унификацию имён в соответствии с форматом class.classname.inc.php и хранятся в папке inc в вашем приложении.

Контроллер может использовать PHP функцию __autoload() для динамического присоединения только тех классов, которые нужны, а не включать все 150 просто на всякий случай:

 

<?php
function __autoload($class_name)
{
include_once 'inc/class.' . $class_name . '.inc.php';
}
?>

Аргумент 3: легче обеспечивать поддержку

При правильном использовании ООП позволяет получить более компактный код. Поэтому, гораздо проще внести изменения в код, чем разматывать спагетти процедурной реализации.

Если определённый массив информации получает новый атрибут, то при процедурном подходе ( в худшем случае) может потребоваться вставлять новый атрибут в каждую функцию, которая использует массив. А приложение ООП может быть изменено простым добавлением нового свойства и нового метода для обработки свойства.

Большинство преимуществ, описанных в данном разделе являются продуктом сочетания ООП и DRY программирования. Возможно создать простой для поддержки процедурный код, который не будет ночным кошмаром разработчика, и сделать ужасный проект га принципах ООП. Pro PHP и jQuery являются отличными примерами хороших привычек программирования в сочетании с ООП для генерации кода, который легко читать и модифицировать.

Резюме

Изучение ООП продвигает вас на следующий уровень в программировании. При правильном использовании ООП помогает Вам создавать легко читаемый, простой для поддержки, портативный код, который сохранит для вас (и для тех, кто работает с вами) часы наряженной работы над проектом.


После создания класса, новый объект может быть реализован и сохранен в переменной с использованием ключевого слова new:

  1. Комментарии (0)

  2. Add Yours

Комментарии (0)

There are no comments posted here yet

Оставьте свой комментарий

Posting comment as a guest. Sign up or login to your account.
Вложения (0 / 3)
Share Your Location

Векторная графика

плашки-для-рекламных-текстов Набор ярких плашек для рекламных текстов в векторном формате, которые значительно выделят ваш текст на общем фоне. Формат файлов: AI / EPS /...
start-up-rockets-–-ракеты-в-векторе Набор векторных изображений, разного вида летящих ракет. Можно использовать при создании анимации и рекламных баннеров. Формат файлов:...
pop-art-man-векторные-мужчин-в-стиле-поп-арт Набор изображений в векторном формате, яркие иллюстрации мужчин в модном стиле поп арт, отлично подойдёт при создании рекламных баннеров. Формат...

Растовая графика

атлетика-и-бодибилдинг-–-фото-клипарт Набор из 32 изображений высокого качества на тему атлетики и бодибилдинга. Отлично подойдут для рекламных флаеров, баннеров и слайдеров на сайтах...
интернет-технологии,компьютер,гаджеты-–-фото-клипарт Набор из 25 изображений высокого качества, различные интернет технологии, компьютеры, гаджеты. Отлично подойдет для слайд-шоу. Размер 4800 на 3200 px....
бизнес-леди-–-набор-фото-клипарта Набор из 15 изображений высокого качества с красивой блондинкой, бизнес-леди. Эти изображения отлично подойдут для использования в презентациях,...