Отправляет email-рассылки с помощью сервиса Sendsay

Создание сайтов на Python

  Все выпуски  

PHP. Веб программирование для профессионалов. Второй выпуск рассылки: ООП в ПХП.


Здравствуйте мои дорогие подписчики!

Жара, лето – самое время улучшить свои знания и опыт в области программирования :). Об отдыхе не забываем. Максимум две недели на отдых, если больше двух недель – то появится лень, от которой трудно в последствии избавиться.

Сегодня я хочу затронуть тему ООП (объектно-ориентированного программирования) в PHP5. Предполагаю, что все подписчики уже работают с ООП, или имеют опыт работы с ООП в других языках (C++, Java). Тем, кто не знаком с ООП, советую ознакомиться с ним и взять этот подход за правило, это поможет вам при создании крупных приложений. Советую книгу «PHP5 для профессионалов», издательства Wrox (перевод на русский: Диалектика или Символ).

При создании крупного проекта один человек не в состоянии справиться со всеми поставленными задачами в срок. Необходимо взаимодействие нескольких разработчиков, либо групп разработчиков работающих с единой целью – быстро и качественно создать программный продукт. В данный момент мы не затрагиваем вопросы «контроль версий» и «тестирование программных продуктов», этому будут посвящены следующие выпуски.

Итак, чем же помогает ООП? Каждый разработчик создает свой класс, и открывает лишь некоторые методы для внешнего обращения к его классу. Вы вызываете метод, не зная как он реализован, но знаете, что он делает то, что описано в его спецификации (описании). Например, вызываем метод FindText() класса Forum, и получаем массив результатов. Как происходил поиск – не важно, а главное - что есть верные результаты.

 Вы конечно же знаете, что каждый объект одного и того же класса имеет свои свойства и методы. Все свойства в идеале должны быть срытыми от других разработчиков внутри объекта (иметь атрибут private). Если требуется открыть доступ к свойству, то делайте это так: создаете новый открытый метод (public), через который возвращаете значение скрытого свойства. Никогда не делайте свойства класса public! Вот пример:

class User
{
    
private $intUserID;
    
public function getUserID()
     {
         
return $this->intUserID;
     }
}

Этот подход позволит в дальнейшем модифицировать класс User, и не затрагивать логику того кода, который использует объект класса User. Например, после создания проекта, вам поставили задачу: «идентификатор пользователя может быть возвращен только администратору, всем остальным будет возвращено false». Вносим изменения только в наш метод класса User, не затрагивая тысячи строк уже написанного кода.

class User
{
     private $intUserID;
     private $intAccess;
     public function getUserID()
     {
          //
выводим идентификатор только для администратора
          if($this->intAccess!=ADMINISTRATOR)
                return false;
          return $this->intUserID;
     }
}

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

 

Давайте рассмотрим другую задачу. Бывают ситуации, когда следует создать некоторый набор классов, но все классы должны быть построены по одному образцу. Давайте сразу рассмотрим пример: «необходимо создать набор классов, работающих с базой данных. Каждый класс работает с базой данных своего типа (MySQL, PgSQL и т.д.)». Мы знаем, что у всех баз данных (БД) есть много общего, но и есть различия. Select, Insert и Delete есть у всех СУБД (систем управления базами данных, такие как MySQL). Итак, задача стоит следующим образом: «необходимо создать набор классов, каждый из которых реализует взаимодействие с СУБД своего типа». Рассмотрим пример:

<?
abstract class Database
{
     //
только описываем функции, но не реализовываем их
     public function Select(…);

     public function Insert(…);
     public function Delete(…);
     //
ниже можем создать несколько классов, которые будут реализованы
     public function __construct()
     { echo “
Объект создан”; }
}
?>

Этот класс отражает те методы, которые будут содержаться в дочерних классах (таких как MySQL). Ключевое слово abstract говорит о том, что этот класс не является самостоятельным, т.е. нельзя создать объект этого класса. Можно создать новые классы на основе данного класса Database.

Опишем класс для PgSQL, который реализует те методы, которые описаны в его родительском классе Database:

<?
class PgSQL extends Database

{

     public function Select(…)

{ // делаем выборку результата

}
     public function Insert(…)

{ // делаем вставку данных

}
     public function Delete(…)

{ // удаляем строки из СУБД

}

}
?>

 

Теперь реализуем класс MySQL. Обратите внимание, что в MySQL несмотря на все реализованные методы, добавляется свой собственный метод Update() который отсутствует в других СУБД.

<?
class MySQL extends Database
{
     public function Select(…)

{ // делаем выборку результата

}
     public function Insert(…)

{ // делаем вставку данных

}
     public function Delete(…)

{ // удаляем строки из СУБД

}

public function Update(…)

{ // этот метод есть только у MySQL

}

}
?>

 

Стоит заметить, что при реализации нового класса на основе класса Database, следует реализовать все методы родительского класса. Если хоть один метод класса Database не будет реализован – то ничего не будет работать (PHP выдаст ошибку). Этот факт позволяет вам быть уверенным в том, что все классы, построенные на основе класса Database, будут иметь набор одинаковых методов (Select, Insert, Delete).

Теперь вы хотите в своем приложении добавить поддержку баз данных MsSQL. Что вы делаете? Создаете класс с именем MsSQL который создается на основе Database, и реализуете все методы, описаны в Database. Пи этом вы не изменяете не одной строки внутри своей программы, которая может содержать много тысяч строк. Это очень удобно в применении, и экономит ваше время и силы.

 

Более подробно об уровнях абстракции баз данных можно прочесть в книге «PHP5 для профессионалов» и «Профессиональное PHP программирование» издательства Wrox. Так же можете посетить веб сайт php.net, где существует реализованный уровень абстракции баз данных. Однако, он очень универсален, и я не рекомендую его использовать в своих проектах по причине низкой производительности (этот класс содержит множество методов, которые вы, скорее всего, никогда не будете использовать).

 

Надеюсь вы узнали сегодня для себя что-то новое.
Пишите предложения по оформлению следующего выпуска, и замечания по данному выпуску.
Спасибо за внимание!


В избранное