Об’єктно-орієнтоване програмування та класи, частина 2. Розсильників пошти, PHP, Програмування, статті

Дмитро Лебедєв 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: “Вася Пупкін”

Reply-to: “Вася Пупкін”

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, а решта – дочки), але розсильників має скоріше робочу, ніж демонстраційну задачу. До того ж, це не найкращий спосіб підтримки різних баз даних: зручніше тримати все в одному класі, який знає функції різних серверів. Так, і, до того ж, тут зроблено два класи лише для підтримки зберігання адрес в файлах.

Завантажити розсильників можна, натиснувши на посилання нижче.

Файли:

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*