InfoCity
InfoCity - виртуальный город компьютерной документации
Реклама на сайте







Размещение сквозной ссылки

 

Объектно-ориентированное программирование и классы, часть 2. Рассыльщик почты

Дмитрий Лебедев aka DJ Rabbit, 2000-2001
Клуб PHP-разработчиков, 1999-2001

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

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

1. Необходимо одновременная обработка нескольких переменных (например, передавать их в качестве параметров функции - писать все переменные не много ли чести? :). То есть, переменным нужно придать некоторую структуру, ассоциацию. Чтобы функция без дополнительных указаний сразу видела, с чем ассоциирована данная переменная, и что с ней делать.

2. Подобных структур данных может быть несколько. Если использовать шаблоны, большинство методов можно использовать повторно. Когда структуры данных несколько различаются, можно использовать механизм наследования.

Описанный мною в прошлом выпуске класс CMail я использовал для рассылки новостей. Но когда количество подписчиков перевалило за 50, программа не успевала выполниться за минуту (именно такое ограничение было у провайдера). Причина - в том, что рассылался файл с аттачментом, и каждый раз программа его кодировала в base64 и рисовала переносы строк. Класс, правда, не был предназначен для рассылки почты подписчикам. Но это так, детали...

ООП на службе почты

Что возьмём за объект? Правильно, письмо. При рассылке почты многим подписчикам надо будет поменять лишь адрес получателя.

class Message {

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

class Message {
  var $text = "";
  var $to = "";
  var $subject = "Новости сайта Васи Пупкина";
  var $headers = "
From: "Вася Пупкин" <vasya@pupkin.ru>
Reply-to: "Вася Пупкин" <vasya@pupkin.ru>
Organization: Студия веб-дезигна Васи Пупкина
X-Mailer: PHP/4
X-Priority: 3 (Normal)
Content-Type: text/plain; charset=koi8-r
";

Конструктор объекта.

  function Message($text) {
    $this->text = $text;
    }

Функция отправки одного письма.

  function send() {
    mail(convert_cyr_string($this->to,"w","k"), convert_cyr_string($this->subject, "w", "k"), convert_cyr_string($this->text, "w", "k"), convert_cyr_string($this->headers, "w", "k"));
    }

Функция отправки писем всем подписчикам.

  function send_all($maillist) {
    if (is_object($maillist))
      if ($maillist->fetch())
        for ($a=0;$a<sizeof($addr);$a++) {
          $this->to = $maillist->addr[$a];
          $this->send();
          };
    }
  }

И это всё, что есть в классе Message. Список подписчиков хранится в объекте $maillist, который мы передаем в качестве параметра функции (естественно, в теле программы назвать можно его как угодно).

Вместе с классом Message я использую классы Database (пока поддерживает только MySQL, если кто-то пришлет то же самое для другой базы, буду много благодарен) и класс File, которые используются для получения списка адресатов.

class File {
  var $filename = "";
  var $addr = array();

  function File($filename) {
    $this->filename = $filename;
    }

  function fetch() {
    $this->addr = file($this->filename);
    if ($this->addr)
      return true;
    else
      return false;
    }
  }

Это класс файла. Класс базы данных - сложнее. Помимо считывания информации там есть функции конфигурации соединения с сервером (например, программа может устанавливать соединение, а потом его закрывать, или использовать имеющееся), установка логина/пароля/хоста сервера БД. А аргументами к функции-конструктору являются имя таблицы, имя поля и условия выборки.

Итог

Разделив получение адресов подписчиков и сам процесс рассылки в разные классы, мы получаем много полезного. В том числе

1) все операции на своих местах ("Ты не установил соединение с базой в главной программе!")
2) отсюда - упрощение процесса отладки ("Почему здесь переменная пустая?!")
2) читаемый код ("А что делается в этих строках?!")
3) легко модифицируемый код ("Там, сверху, замени коннект к базе, и снизу в пяти местах фетч исправь на новый.")

Если вы используете не MySQL (у меня, к сожалению, поддерживается только он), можно взять класс Database и подправить под нужную вам базу. Конечно, можно было в программе замутить наследственные классы (один класс Database, а остальные - дочки), но рассыльщик имеет скорее рабочую, чем демонстрационную задачу. К тому же, это не лучший способ поддержки разных баз данных: удобнее держать все в одном классе, который знает функции разных серверов. Да, и, к тому же, здесь сделано два класса лишь для поддержки хранения адресов в файлах.

Скачать рассыльщика можно, нажав на ссылку ниже.


Файлы:


Реклама на InfoCity

Яндекс цитирования



Финансы: форекс для тебя








1999-2009 © InfoCity.kiev.ua