PEAR – PHP Extension and Application Repository

Руководство для начинающих

Автор: Дмитрий Димандт aka Mamut
Источник: RSDN Magazine #5-2004
Опубликовано: 30.03.2005
Версия текста: 1.0
Что такое PEAR
Структурированная библиотека открытого кода
Классы PEAR и PEAR_Error
Установка
Документация
Будущее PEAR
А можно и мне поучаствовать в PEAR?
Ссылки

Что такое PEAR

PEAR расшифровывается как PHP Extension and Application Repository, база расширений и приложений для PHP. Но что же это действительно значит?

Представьте, что Ваш проект использует MySQL в качестве базы данных. PHP предоставляет вам встроенные средства для работы – функции mysql_* или (начиная с версии 5.0) расширение mysqli. У вас есть десятки файлов, содержащих примерно следующий код:

<?php
   /* Соединяемся, выбираем базу данных */
   $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
       ordie('Не смогли подсоединиться : ' . mysql_error());

   print'Успешно подсоединились';
   mysql_select_db('my_database') ordie('Could not select database');

   /* Выполняем SQL-запрос */
   $query = 'SELECT * FROM my_table';
   $result = mysql_query($query) 
     ordie('Не смогли выполнить запрос: ' . mysql_error());

   /* Выводим результаты в html */
   print'<table>\n';
   while ($line = mysql_fetch_array($result, MYSQL_ASSOC))
 {
       print'\t<tr>\n';
       foreach ($line as $col_value)
 {
           print"\t\t<td>$col_value</td>\n"</str>;
       }
       print'\t</tr>\n';
   }

   print'</table>\n';

   /* Освобождаем память от результата */
   mysql_free_result($result);

   /* Закрываем соединение */
   mysql_close($link);
?>

В один прекрасный день ваш шеф говорит, что политика компании изменилась, и что отныне вам придется иметь дело с Oracle, PostgreSQL или (боже упаси!) MSSQL. Что Вам приходится делать? Рвать на себе волосы и биться головой об стенку. Так как количество кода неимоверно, а слепая замена mysql_* на ora_* не пойдет.

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

<?php
class MyDBClass
{
  
  function MyDBClass()
  {
  }

  function connect($dbhost, $dbname, $login, $password)
  {
    $link = mysql_connect($dbhost, $login, $password);
    if($link === false)
return false;

    return mysql_select_db($dbname, $link); 
  }

  function query($sql)
  {
    return mysql_query($sql);
  }
}
?>

Если придется переходить на Oracle, то все, что нужно будет сделать - заменить строчки подсоединения к БД и выборки результатов. Но тут в голову пробирается назойливая мыслишка: "А не велосипед ли я изобретаю?" Именно велосипед, поскольку уже существует PEAR. PEAR – это набор готовых, протестированных велосипедов на все случаи жизни.

Согласно официальному сайту PEAR – это:

Структурированная библиотека открытого кода

Чтобы понять, что это такое, советую посмотреть список «пакетов», доступных в PEAR. Глаза разбегаются от разнообразия. Авторизация, работа с датами и временем, работа с файловой системой, базы данных, HTTP и так далее…

Код в PEAR разделен на так называемые «пакеты» (packages). Каждый из пакетов – набор классов и утилит, написанных на PHP и представляющих собой решение какой-нибудь распространенной проблемы.

Каждый пакет – детище одного или нескольких программистов, решивших облегчить жизнь самим себе, а в итоге облегчающих жизнь нам с Вами. Более того, пакеты, прошедшие тщательную проверку, включаются в дистрибутив PHP и получают название базового класса (PHP Foundation Class). Так, например, DB и HTTP являются базовыми классами PHP.

Пакеты из PEAR освобождают от необходимости написания тривиальных или часто необходимых вещей. Так как эти пакеты написаны на чистом PHP, не придется требовать от провайдера, чтобы он устанавливал какие-либо дополнительные модули на сервере, где размещен ваш сайт. И главное. Они – бесплатные.

Классы PEAR и PEAR_Error

Большая, но не вся, часть пакетов в PEAR опирается на классы PEAR и PEAR_Error, определенные в пакете… PEAR.

Класс PEAR

В версиях PHP меньше 5.0, и в пакетах, еще не перешедших на 5.0, этот класс эмулирует деструкторы в наследуемых классах.

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

$obj =& new PEAR_child;

Этот класс имеет метод isError($obj), определяющий, является ли тот или иной объект объектом PEAR_Error.

Класс PEAR_Error

Используется для создания стандартизированых сообщений об ошибках.

Установка

Ниже приводится последовательность шагов, необходимых для использования пакетов PEAR, на примере пакета DB. Предупреждаю сразу, предложенный ниже способ отличается от официального (http://pear.php.net/manual/ru/installation.php). Предлагаемый мною способ универсален, работает на любых конфигурациях PHP и сервера.

1.Для начала нужно скачать пакет PEAR. Пакеты распространяются в заархивированом (.tar.gz или .tgz) виде, поэтому понадобится разархиваторы.

2. Распакуйте архив в какую-нибудь директорию.

3. Для дальнейшей работы из всей кучи файлов понадобится только PEAR.php. Если в работе понадобятся платформенно-независимые системные функции (определение текущей ОС на сервере, рекурсивный обход директорий, удаление директорий и проч.), взгляните также на файл System.php.

4. Создайте в структуре вашего сайта директорию pear/ и скопируйте PEAR.php туда. Теперь все готово к работе.

5. Рассмотрим дальнейшие действия на примере использования в проекте пакета DB, служащего для унифицированого доступа к базам данных. Зайдите на http://pear.php.net/package/DB и скачайте этот пакет.

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

Summary – краткое описание пакета. Обычно – емкое название, его характеризирующее.

License – лицензия, на условиях которой пакет выпускается. Несмотря на то, что пакеты в PEAR рекомендуется публиковать на условиях PHP License, некоторые пакеты выпускаются на условиях GNU Public License. На это стоит обратить внимание при работе над коммерческим проектом.

Current Release – текущая версия пакета.

Description – описание пакета.

Packages that depend on ... – другие пакеты, которые используют данный пакет.

6. Распакуйте пакет DB.

7. Скопируйте файл DB.php и поддиректорию DB/ в директорию pear/ вашего сайта.

8. Откройте файл DB.php в вашем любимом редакторе, найдите строчку require_once 'PEAR.php'; и сотрите ее. Сохраните файл.

9. В корневом каталоге сайта создайте файл testdb.php. Структура сайта должна выглядеть примерно так:

/-
  |_ testdb.php
  |_ pear
      |_ PEAR.php
      |_ DB.php
      |_ DB
          |_ common.php
          |_ ...

10. В файл testdb.php впишите следующее:

<?php
  require_once('pear/PEAR.php');
  require_once('pear/DB.php');
?>

11. Проверьте файл на работоспособность. Как видите – ни одной ошибки : ) Правда, это не значит, что все работает.

12. Добавьте в файл testdb.php следущий код:

<?php
  require_once('pear/PEAR.php');
  require_once('pear/DB.php');

  $myDB =& DB::factory('mysql'); // подсоединяемся к mysql
  $myDB -> connect(DB::parseDSN('mysql://login:password@host/database')); //подсоединяемся к базе

  $q = 'SELECT * FROM test_table'; // какой-нибудь запрос
  $result = $myDB -> query($q);
  if(!DB::isError($result) && $result -> numRows() > 0) //проверяем корректность выполнения запроса
  {
    while($row = $result -> fetchRow(DB_MOD_ASSOC)) // получаем ассоциативный массив значений
    {
      print('field_1 = '.$row['field_1']);
      // etc...  
    }
  }
?>

13. Теперь осталось сделать $myDB глобальной переменной и вынести ее инициализацию в отдельный модуль. Тогда для того, чтобы изменить базу данных на, скажем, PostgreSQL, достаточно будет изменить ровно две строчки в коде.

Все. Теперь вы знаете, как подключить любой пакет из PEAR.

Документация

Как известно, программисты – тоже люди и ничто человеческое им не чуждо. Также им не чужда лень и патологическое нежелание писать документацию к своим творениям. Увы, авторы пакетов PEAR – не исключение, и полноценная документация к пакетам встречается нечасто.

Неужели все так плохо? – спросите вы, окидывая взглядом необъятные просторы PEAR. Нет, на самом деле все не так плохо.

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

Собранную на текущий момент документация по PEAR можно найти по адресу http://pear.php.net/manual/index.php.

Будущее PEAR

Многие, прочитав статью и увидев упор на решения, использующие базы данных, могут махнуть на PEAR рукой, указав на появившееся в PHP5 расширение mysqli. Другие, обнаружив, что PEAR бесплатен и разрабатывается на общественных началах, также махнут на него рукой и сядут разрабатывать свою собственную систему. Третьи, решив, что главная задача PEAR – эмуляция объектной ориентации (например, эмуляция деструкторов, предлагаемая классом PEAR), махнут рукой, забудут про PEAR и перейдут на PHP5.

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

Например,

И так далее. Шифрование, авторизация, работа с изображениями, а также многое другое. Достаточно взглянуть на список предлагаемых пакетов (http://pear.php.net/packages.php).

Основная задача разработчиков PEAR сейчас – стабилизация уже существующего кода и приведение всех пакетов в соответствие со стандартом (http://pear.php.net/manual/ru/standards.php). На сайте действует система отслеживания багов, где можно сообщить о найденных ошибках или предложить изменения/дополнения к существующим пакетам. Условия приема пакетов способствуют тому, что код в исходных файлах четко и ясно написан, а также документирован, что облегчает их использование. Состояние PEAR отслеживается в еженедельных публикациях на сайте разработчиков PHP – Zend Group, а «мертвые» (находящиеся в ранней стадии разработки и давно не обновляемые) пакеты удаляются из базы.

PEAR – это динамичная развивающаяся среда, предлагающая все новые и новые решения разработчикам.

А можно и мне поучаствовать в PEAR?

Конечно можно! Если у вас появилось желание создать новый пакет PEAR для задачи, решения которой пока нет в PEAR, то читайте Справочник (New Maintainers' Guide, http://pear.php.net/manual/en/guide-newmaint.php) и – добро пожаловать!

Ссылки


Эта статья опубликована в журнале RSDN Magazine #5-2004. Информацию о журнале можно найти здесь